🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27321

Re: jak sensownie polaczyc watki z rekurencja?

#27321
From: królewna
Date: Fri, 26 Feb 2010 10:34
61 lines
3109 bytes
W dniu 25.02.2010 17:52, Slawomir Piasecki pisze:

> def f(q, n):
>      for i in range(2,4):
>        t = i * n
>
>        if t<  100:
>          print "dodaje ", t
>          q.put(t) # dodaj do kolejki
>
> def run(nrStart):
>       q = Queue()
>
>       for i in range(nrStart):
>         q.put(i) # dodaj do kolejki
>
>       nr = 2
>       pula = []
>
>       while True:
>         for i in pula:
>           if i.is_alive() is False:
>             pula.remove(i) # usun z puli jesli juz wykonany
>
>         while len(pula)<  nr:
>             if q.qsize()>  0:
>               dat = q.get() # pobierz z kolejki
>               print "startuje ", dat
>               p = Process(target=f, args=(q, dat)).start() # wystartuj
> z procesem
>               pula.append(p) # dodaj do puli
>
>             else:
>               if len(pula) == 0:
>                 return # zakoncz
>               else:
>                 break # wroc do petli
>
>         sleep(5) # czekaj
>

Tak jak Łukasz powiedział czekasz za każdym razem 5 sekund. Więc jeśli 
proces trwa 0.5 sekundy (lub (x * 5s) + 0.5s) i zadań dla procesów masz 
100 to za każdym uruchomieniem oszczędzałbyś 4.5s * 100 = 450 sekund co 
daje około 7 minut 30 sekund oszczędności.

Do tego wystarczy użyć funkcji select.select() i jako input dać 
q._reader (oczwywiście tylko jeśli q to multiprocessing.Queue a nie 
Queue.Queue)

Zastanów się, czy nie lepiej jest sprawdzać czy masz coś już w kolejce i 
ewentualnie nie zwracać procesów, które zakończyły swoje zadanie do puli 
wolnych procesów i także użyć selecta albo użyć semafora o wartości 
początkowej równej maksymalnej liczbie procesów i wywoływać za każdym 
nowym zadaniem acquire na semaforze.

Nawet fajna logika programu. Ale o ile dobrze widzę, to z zewnętrznej 
pętli nie wyjdziesz nigdy.

No fajnie - sama zaczynam udzielać porad (mam nadzieję, że nie gadam 
głupot) :)
Technical Details
Message-ID: <hm882p$tf8$1@news.task.gda.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.task.gda.pl!not-for-mail
References: <77c00642-1b59-418a-a26a-fb99b3c32e81@g11g2000yqe.googlegroups.com> <b630f510-d64c-4eaf-8212-0f1b80d11a1f@v25g2000yqk.googlegroups.com> <4d45db34-b9c3-4939-8a81-6e6afe9b507c@f35g2000yqd.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.task.gda.pl!not-for-mail
From: królewna <krolewna@ee.pl>
Newsgroups: pl.comp.lang.python
Subject: Re: jak sensownie polaczyc watki z rekurencja?
Date: Fri, 26 Feb 2010 11:34:01 +0100
Organization: CI TASK http://www.task.gda.pl/
Lines: 61
Message-ID: <hm882p$tf8$1@news.task.gda.pl>
References: <77c00642-1b59-418a-a26a-fb99b3c32e81@g11g2000yqe.googlegroups.com>  <b630f510-d64c-4eaf-8212-0f1b80d11a1f@v25g2000yqk.googlegroups.com> <4d45db34-b9c3-4939-8a81-6e6afe9b507c@f35g2000yqd.googlegroups.com>
NNTP-Posting-Host: chello089074011030.chello.pl
Mime-Version: 1.0
X-Trace: news.task.gda.pl 1267180441 30184 89.74.11.30 (26 Feb 2010 10:34:01 GMT)
X-Complaints-To: abuse@news.task.gda.pl
NNTP-Posting-Date: Fri, 26 Feb 2010 10:34:01 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.9.1.7) Gecko/20100111 Thunderbird/3.0.1
In-Reply-To: <4d45db34-b9c3-4939-8a81-6e6afe9b507c@f35g2000yqd.googlegroups.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit