Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

jak przeslac dane z 1 petli nieskonczonej do drugiej?

3 views
Skip to first unread message

Slawomir Piasecki

unread,
Apr 19, 2008, 7:53:23 AM4/19/08
to
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

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.

Cinu

unread,
Apr 19, 2008, 8:09:42 AM4/19/08
to

Przeczytaj prezentację do której link został zamieszczony parę tematów
niżej (nt. generatorów).

-- Marcin Krupowicz

Rob Wolfe

unread,
Apr 19, 2008, 9:46:41 AM4/19/08
to
Slawomir Piasecki <pias...@gmail.com> writes:

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

Slawomir Piasecki

unread,
Apr 20, 2008, 1:26:05 PM4/20/08
to
fajny artykul, ale jak by to mialo wygladac dwa watki i w kazdym
wczesniej wymienione petle? i za pomoca Queue przekazywanie danych?

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.

Rob Wolfe

unread,
Apr 21, 2008, 2:42:40 AM4/21/08
to

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

Janusz A. Urbanowicz

unread,
Apr 21, 2008, 9:26:07 AM4/21/08
to
Slawomir Piasecki <pias...@gmail.com> writes:

> 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ł Dwużnik

unread,
Apr 21, 2008, 10:23:06 AM4/21/08
to
Janusz A. Urbanowicz wrote:
>> 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?
>
Zaraz przyjdą wyznawcy sortowania i Ci wytłumaczą, że to na pewno
świetne ćwiczenie :)

Michał

Janusz A. Urbanowicz

unread,
Apr 21, 2008, 11:30:11 AM4/21/08
to
Michał Dwużnik

<Michal{dot}Dwuznik{at}cern{dot}c...@think.before.replying> writes:

>> 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

Michał Dwużnik

unread,
Apr 21, 2008, 1:21:11 PM4/21/08
to
Janusz A. Urbanowicz wrote:
> Michał Dwużnik
> <Michal{dot}Dwuznik{at}cern{dot}c...@think.before.replying> writes:
>
>>> 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
>
Czy ja wyglądam jak zwolennik przepisywania rynca?
Pozdrawiam
Michał

Slawomir Piasecki

unread,
Apr 26, 2008, 8:56:16 AM4/26/08
to
Kurcze mecze te watki i cos mi jeszcze nie wychodzi, mozecie rzucic
okiem na moje wypociny i sprawdzic?

## 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.

Slawomir Piasecki

unread,
Apr 28, 2008, 5:43:50 AM4/28/08
to
#! /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)

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.

Rob Wolfe

unread,
Apr 28, 2008, 6:01:16 AM4/28/08
to

Slawomir Piasecki napisał(a):

> #! /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

Slawomir Piasecki

unread,
Apr 28, 2008, 6:25:36 AM4/28/08
to
>
> 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)

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

Adam Karpierz

unread,
Apr 28, 2008, 6:29:08 AM4/28/08
to
Użytkownik "Rob Wolfe" <r...@smsnet.pl> napisał:

> Nie poddawaj sie. Zaczynasz kumac temat. ;)

Wolfe - jestes ozdoba - merytoryczna i 'ludzka' tej grupy :)

AK


Rob Wolfe

unread,
Apr 28, 2008, 6:47:56 AM4/28/08
to

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

Adam Przybyla

unread,
Apr 29, 2008, 1:16:33 AM4/29/08
to
... poczytaj o yeld ;-) Generatory "tfoim pszyjatsielem";-))) Z powazaniem
Adam Przybyla

Slawomir Piasecki

unread,
Apr 29, 2008, 4:53:18 AM4/29/08
to
mam jeszcze jedno pytanie zupelnie nie zwiazane z tematem
i typowo od poczatkujacego programisty, w sumie to powinienm
zadac je juz dawno temu...

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.

Tupteq

unread,
Apr 29, 2008, 5:14:45 AM4/29/08
to
Slawomir Piasecki wrote:
> 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?

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

0 new messages