czy moglibyscie mi pomuc z malym problemem na jaki trafilem?
chcialbym zrobic programik, ktory sprawdzal by sobie powiedzmy co 5
min
dwa katalogi i sprawdzal czy pojawily sie jakies nowe pliki, jesli
tak
to dodaje do pewnej listy, nastepnie zaaktualizowana liste
dostarcza do programu rozsylajacego te pliki na server ftp'a
mam czesc wyszukujaca pliki i dodajaca do listy kolejne
zadania, oraz czesc rozsylajaca, pliki
problem sie pojawia teraz w polaczeniu obu tych klockow,
oba te klocki dzialaja na zasadzie nieskonczonej petli,
nie mam pomyslu jak dodac nowe zadania odnalezione
w 1 petli do zadan wykonywanych w drugiej petli,
zalezy mi na tym aby obie petle dzialaly rownoczesnie
dzieki za wszelkie sugestie i podpowiedzi
pozdrawiam
p.s.
Przeczytaj prezentację do której link został zamieszczony parę tematów
niżej (nt. generatorów).
-- Marcin Krupowicz
Jeśli to jeden programik, to patrz moduł `threading` i `Queue`.
Nieśmiało mogę Cię też przekierować tu:
http://www.rwdev.eu/articles/threads
Jeśli miałyby to być dwa oddzielne programiki, to patrz moduł
`processing`:
http://pypi.python.org/pypi/processing
i również `Queue`.
RW
kolejne pytanie odnosnie tego artykulu
# wrzucamy 5 zadan
kolejka_zadan.put(4)
kolejka_zadan.put(5)
kolejka_zadan.put(3)
kolejka_zadan.put(1.5)
kolejka_zadan.put(2.2)
rozumiem ze mamy tutaj adpalone 5 watkow i kazdy nalezy zakonczyc?
# wysylamy zadania zakonczenia przetwarzania do wszystkich watkow
for i in range(N_liczba_watkow):
kolejka_zadan.put(None)
czyli w moim przykladzie kazdy nowo odnaleziony plik tworzy nowy
watek, ktory nastepnie przesyla
do kolejki wysylajacej pliki, dane o tym pliku i nastepnie po dodaniu
pliku do koleiki odylam wiadomosc,
zeby zamknac/skillowac watek?
> Jeśli to jeden programik, to patrz moduł `threading` i `Queue`.
> Nieśmiało mogę Cię też przekierować tu:http://www.rwdev.eu/articles/threads
>
a w przypadku dwoch porogramow, da sie wogule pobierac dane w juz
dzialajacym programie, wyslane z innego?
> Jeśli miałyby to być dwa oddzielne programiki, to patrz moduł
> `processing`:http://pypi.python.org/pypi/processing
> i również `Queue`.
>
> RW
co do generatorow to nie bardzo wiem jak moglbym je wykorzystac...
p.s.
Slawomir Piasecki napisał(a):
> fajny artykul, ale jak by to mialo wygladac dwa watki i w kazdym
> wczesniej wymienione petle? i za pomoca Queue przekazywanie danych?
Dokladnie tak. W jednej petli wrzucasz dane do kolejki, a w drugiej
odczytujesz.
> kolejne pytanie odnosnie tego artykulu
> # wrzucamy 5 zadan
> kolejka_zadan.put(4)
> kolejka_zadan.put(5)
> kolejka_zadan.put(3)
> kolejka_zadan.put(1.5)
> kolejka_zadan.put(2.2)
>
> rozumiem ze mamy tutaj adpalone 5 watkow i kazdy nalezy zakonczyc?
Ilosc zadan != ilosc watkow.
Mozesz do kolejki wrzucic i setki zadan, a pracowac na tym moga np 3
watki.
> # wysylamy zadania zakonczenia przetwarzania do wszystkich watkow
> for i in range(N_liczba_watkow):
> kolejka_zadan.put(None)
>
> czyli w moim przykladzie kazdy nowo odnaleziony plik tworzy nowy
> watek, ktory nastepnie przesyla
> do kolejki wysylajacej pliki, dane o tym pliku i nastepnie po dodaniu
> pliku do koleiki odylam wiadomosc,
> zeby zamknac/skillowac watek?
Nie.
W Twoim przypadku maja pracowac dwa watki. Jeden wrzuca do kolejki
kazdy odnaleziony plik (czy co tam potrzeba), a drugi te dane
przetwarza.
Zamykasz watki dopiero, gdy program ma zakonczyc dzialanie. W
przeciwnym
razie caly czas pracuja dwa watki.
>
> > Jesli to jeden programik, to patrz modul `threading` i `Queue`.
> > Niesmialo moge Cie tez przekierowac tu:http://www.rwdev.eu/articles/threads
> >
>
> a w przypadku dwoch porogramow, da sie wogule pobierac dane w juz
> dzialajacym programie, wyslane z innego?
Tak. Wspomniany przeze mnie modul `processing` pozwala na
wspoldzielnie
obiektu `Queue` przez oddzielne procesy. Co wiecej korzystasz z tej
kolejki tak samo jak w przypadku watkow.
Cos mi sie wydaje, ze jednak brak Ci nieco podstaw w tym temacie,
takze na Twoim miejscu poczytalbym nieco o IPC (Inter-Process
Communication).
RW
> witam wszystkich
>
> czy moglibyscie mi pomuc z malym problemem na jaki trafilem?
>
> chcialbym zrobic programik, ktory sprawdzal by sobie powiedzmy co 5
> min
> dwa katalogi i sprawdzal czy pojawily sie jakies nowe pliki, jesli
> tak
> to dodaje do pewnej listy, nastepnie zaaktualizowana liste
> dostarcza do programu rozsylajacego te pliki na server ftp'a
A po co chcesz reimplementować rsynca?
=alx
--
JID: al...@hell.pl
PGP: 0x46399138
od zwracania uwagi na detale są lekarze, adwokaci, programiści i zegarmistrze
-- Czerski
Michał
>> A po co chcesz reimplementować rsynca?
>>
> Zaraz przyjdą wyznawcy sortowania i Ci wytłumaczą, że to na pewno
> świetne ćwiczenie :)
ćwiczyć to se można w weekend, w domu, a nie na produkcji
## funkcja wyszukujaca zadania
class searchFile(threading.Thread, main):
def __init__(self, task):
main.__init__(self)
threading.Thread.__init__(self)
self.fini = os.path.join(self.net, 'finished')
self.Split_dir = os.path.join(self.fini, 's')
self.Full_dir = os.path.join(self.fini, 'f')
self.task = task
## =========================================================
def run(self):
taskList = []
split = full = 0
## wyszukuje plikow z katalogu 'extra'
taskList.extend(checkDir(os.path.join(self.fini, 'extra'),
'extra', taskList))
temp = os.listdir(os.path.join(self.main, 'full', 'f_weat'))
nr = len(rmtemp(temp))
## self.lista z clasyy 'main'
for i in self.lista:
lok = position('', os.path.join(self.main, 'split',
's_ad'), i['ip'], i['log'], i['pass'], i['port'], i['loc'])
sampleList = lok.sample()
player, s = lok.play()
## wyszukanie plikow z innych stalych katalogow
taskList.extend(lok.compere2List(sampleList, player, s))
s.quit()
## petla wyszukujaca plikow
while full != nr - 1:
taskList = checkDir(self.Split_dir, 'split', taskList)
taskList = checkDir(self.Full_dir, 'full', taskList)
taskList.sort()
## w tym momencie pokazuje ze jest 7 plikow do wyslania
while len(taskList) > 0:
zad = taskList.pop()
if zad['group'] == 'split': split += 1
elif zad['group'] == 'full': full += 1
## dodanie do kolejki
self.task.put(zad)
time.sleep(300)
## =========================================================
## =========================================================
## =========================================================
## drugi watek wysylajacy pliki
class sendFile(threading.Thread, main):
def __init__(self, task):
main.__init__(self)
threading.Thread.__init__(self)
self.task = task
self.pula = []
## =========================================================
def run(self):
print self.task.get()
task = Queue.Queue()
def main():
print 'start'
inovalbr.searchFile(task).start()
inovalbr.sendFile(task).start()
print 'end'
if __name__ == "__main__":
main()
problem polega na tym ze pierwsza klasa wynajduje pliki
i chyba dodaje do koleiki, pisze chyba gdyz druga classa
ktora powinna pobierac z koleiki zadania wyswietla tylko 1 zadanie
i nie wiem co jest nie tak, ze tylko jedno zadanie pokazuje zamiast
7 ktore znajduje
bede wdzieczny za pomoc
p.s.
import time
import os
import threading
import Queue
task = Queue.Queue()
class searchfile(threading.Thread):
def __init__(self, task):
threading.Thread.__init__(self)
self.task = task
def run(self):
for i in os.listdir('/media/nowy/filmy'):
self.task.put(i)
time.sleep(5)
class sendfile(threading.Thread):
def __init__(self, task):
threading.Thread.__init__(self)
self.task = task
def run(self):
z = self.task.get()
print z
def main():
print 'start'
searchfile(task).start()
sendfile(task).start()
print 'end'
main()
napisalem jakis prosty przyklad z dwoma watkami i przekazaniem zadan z
jednego do drugiego
i ten sam blad co wyzej wyskakuje, czyli pobiera watek 'search'
dostaje tylko 1 zadanie
co tu jest zle? podobno Queue cyt."Powtórzę to jeszcze raz: używaj
Queue do komunikacji między wątkami. Nie musisz się wtedy przejmować
blokadami i innymi niskopoziomowymi technikami. Queue wykona całą
robotę za Ciebie." wg. : http://www.rwdev.eu/articles/threads
a tu wyglada jakby istnial jakis probem z komunikacja pomiedzy watkami
co z tym zrobic?
p.s.
> #! /usr/bin/python python
> # -*- config: iso-8859-2 -*-
>
> import time
> import os
> import threading
> import Queue
>
> task = Queue.Queue()
>
> class searchfile(threading.Thread):
> def __init__(self, task):
> threading.Thread.__init__(self)
> self.task = task
>
> def run(self):
> for i in os.listdir('/media/nowy/filmy'):
> self.task.put(i)
> time.sleep(5)
Wrzucasz zadania bardzo ladnie tylko jeszcze daj znac konsumentowi
(drugi watek) gdzie jest koniec kolejki, czyli po zakonczonej petli
`for`
dodaj , np.:
self.task.put(None)
>
> class sendfile(threading.Thread):
> def __init__(self, task):
> threading.Thread.__init__(self)
> self.task = task
>
> def run(self):
> z = self.task.get()
> print z
Tu pobierasz tylko pierwsze zadanie z kolejki, a pewnie chcesz
przetworzyc wszystkie, czyli:
while True:
z = self.task.get()
if not z:
# ostatnim elementem kolejki jest None, czyli
trafiamy tu
# i konczymy dzialanie watku
break
print z
>
> def main():
> print 'start'
> searchfile(task).start()
> sendfile(task).start()
> print 'end'
>
>
> main()
>
> napisalem jakis prosty przyklad z dwoma watkami i przekazaniem zadan z
> jednego do drugiego
> i ten sam blad co wyzej wyskakuje, czyli pobiera watek 'search'
> dostaje tylko 1 zadanie
> co tu jest zle? podobno Queue cyt."Powtorze to jeszcze raz: uzywaj
> Queue do komunikacji miedzy watkami. Nie musisz sie wtedy przejmowac
> blokadami i innymi niskopoziomowymi technikami. Queue wykona cala
> robote za Ciebie." wg. : http://www.rwdev.eu/articles/threads
> a tu wyglada jakby istnial jakis probem z komunikacja pomiedzy watkami
>
> co z tym zrobic?
Nie poddawaj sie. Zaczynasz kumac temat. ;)
RW
no tu jeszcze musze pomyslec kiedy zakonczyc dzialanie watka
bo w domyslnym programie pliki w przeszukiwanym katalogu
beda sie pojawiac przez pewien czas, i wlasciwie dopiero
jak przestana sie pojawiac te pliki musialbym przerwac prace watku
ale tu jeszcze musze po sprawdzac w calosci program,
> while True:
> z = self.task.get()
> if not z:
pomoglo dzieki, takie proste ale nie wpadlem na to...
>
>
> Nie poddawaj sie. Zaczynasz kumac temat. ;)
zaczynam tez w to wierzyc ;)
a to wszystko dzieki temu artykulowi ktory mi podales
wczesniej przeszukalem kilkanascie tutkow itp. artykolow
i nie moglem skumac...
dzieki za pomoc
Rob
> Nie poddawaj sie. Zaczynasz kumac temat. ;)
Wolfe - jestes ozdoba - merytoryczna i 'ludzka' tej grupy :)
AK
Adam Karpierz napisał(a):
> Uzytkownik "Rob Wolfe" <r...@smsnet.pl> napisal:
>
> > Nie poddawaj sie. Zaczynasz kumac temat. ;)
>
> Wolfe - jestes ozdoba - merytoryczna i 'ludzka' tej grupy :)
Dzieki za uznanie.
Zauwazyles, ze debaty na temat bledow ortografcznych
nie specjalnie mnie interesuja? Python jest o wiele ciekawszy. ;)
RW
pracuje nad projektem dla ktorego juz stworzylem osiem class
i iles tam funkcji, mam pytanie, czy ma jakies znaczenie
czy wszystkie klasy sa w jednym pliku, czy lepiej aby
kazda klasa byla w osobnym, czy ma to jakis wplyw
na predkosc dzialania programu bo z tej 'biblioteki' w ktorej
mam te classy moze dzialac/korzystac 'jednoczesnie'
kilka watkow i subprocessow
a wiec czy lepiej umiescic kazda klase w osobnym pliku
moze zostac w jenym?
dzieki
p.s.
Pogrupuj sobie wszystko tak, jak Tobie odpowiada. Nie ma tutaj
znaczących róznic w prędkości działania, więc nie ma sensu patrzeć na to
od strony wydajności. Najważniejsze jest, żeby się to kupy trzymało.
--
Pozdro... Tupteq