2013-05-06 10 views
5

ich viele Prozesse, jeder Prozess läuft 5 Sekunden später als ein vorhergehender Prozess, nämlich das Zeitintervall zwischen jedem Prozess erstellen möchten beginnt 5 Sekunden ist, so dass: Lauf Verfahren 1 5 Sekunden warten Laufprozess 2 5 Sekunden warten Lauf Prozess 3 5 Sekunden warten .....wie Prozess aus Python Prozesspool holen

wie:

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

aber ich will do_something() aufrufen, nach dem alle Prozess-Exit- ich weiß nicht, wie die Synchronisation hier mit einem Python Pool libary

zu tun, kann ich

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

aber in diese haben Art und Weise, 4 Prozesse gleichzeitig laufen, ich kann das Zeitintervall zwischen den Prozessen nicht entscheiden, ist es möglich, einen Prozess-Pool zu erstellen und dann jeden Prozess holen, so etwas wie

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

Gibt es eine solche Bibliothek oder Quellcode-Schnipsel, die meine Bedürfnisse erfüllen? Dank

+2

Vielleicht könnten Sie Ihrem Funkgerät ein Argument hinzufügen, das die Anzahl der Sekunden angibt, die vor der Verarbeitung gewartet werden müssen? Und berechnen Sie diesen Wert als 5 * i? – mdscruggs

+2

Möchten Sie 'func' alle 5 Sekunden 500 mal anrufen? Warum die Verzögerung? Wie lange dauert ein einzelner 'func'-Anruf? Möchten Sie die Anzahl gleichzeitiger (gleichzeitiger) Anrufe begrenzen? Was passiert, wenn Sie nach 'apply_async()' '' time.sleep() 'hinzufügen? Was willst du stattdessen tun? – jfs

+0

ein einzelner 'func' Anruf dauert 25 Sekunden. und ich möchte 'func' alle 5 Sekunden für viele Male nennen, vielleicht 500 vielleicht 1000. – misteryes

Antwort

0

nur Vorschläge zusammen zu stellen, Sie so etwas wie tun könnte:

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

Sie ein Timeout Argument join() um stecken Prozesse zu handhaben geben könnte; In diesem Fall müssten Sie die Liste immer wieder durchlaufen und abgeschlossene Prozesse entfernen, bis die Liste leer ist.

Verwandte Themen