2013-05-06 9 views
5

Chcę utworzyć wiele procesów, każdy proces trwa 5 sekund później niż w poprzednim procesie, mianowicie przedział czasu pomiędzy każdym procesie rozpoczyna wynosi 5 sekund, tak, że: run proces 1 odczekać 5 sekund proces bieg 2 czekać 5 sekund proces prowadzony 3 czekać 5 sekund .....jak sprowadzić proces z puli procesów pyton

jak:

 for i in range(10): 
      p = multiprocessing.Process(target=func) 
      p.start() 
      sleep(5) 
     #after all child process exit 
     do_something() 

ale chcę zadzwonić do_something() po wyjściu wszystkich procesów nie wiem jak to zrobić synchronizację tutaj

z libary basenie python, mogę mieć

pool = multiprocessing.Pool(processes=4) 
    for i in xrange(500): 
      pool.apply_async(func, i) 
    pool.close() 
    pool.join() 
    do_something() 

ale w tym sposób, 4 procesy będą działać równocześnie, nie mogę zdecydować odstęp czasu między procesami, możliwe jest stworzenie puli proces, a następnie pobrać każdy proces, coś

pool = multiprocessing.Pool(processes=4) 
for i in xrange(500): 
    process = pool.fetch_one() 
    process(func, i) 
    time.sleep(5) 
pool.close() 
pool.join() 
do_something() 

Czy istnieje taka biblioteka lub fragmenty kodu źródłowego, które spełniają moje potrzeby? dzięki

+2

Być może możesz dodać argument do swojej funkcji, który jest liczbą sekund oczekiwania przed przetwarzaniem? I obliczyć tę wartość jako 5 * i? – mdscruggs

+2

Czy chcesz wywoływać 'func' co 5 sekund 500 razy? Dlaczego opóźnienie? Jak długo trwa pojedyncza funkcja 'func'? Czy chcesz ograniczyć liczbę równoczesnych połączeń? Co stanie się, jeśli dodasz 'time.sleep()' po 'apply_async()'? Co chcesz zamiast tego zrobić? – jfs

+0

Indywidualne wywołanie 'func' trwa 25 sekund. i chcę nazywać 'func' co 5 sekund wiele razy, może 500 może 1000. – misteryes

Odpowiedz

0

Wystarczy umieścić sugestie razem, można zrobić coś takiego:

plist = [] 
for i in range(10): 
    p = multiprocessing.Process(target=func) 
    p.start() 
    plist.append(p) 
    sleep(5) 
for p in plist: 
    p.join() 
do_something() 

Można dać argumentu timeout, aby join() w celu obsługi procesów zatrzymany; w takim przypadku będziesz musiał kontynuować iterację na liście, usuwając zakończone procesy, dopóki lista nie będzie pusta.

Powiązane problemy