2011-01-05 4 views
0

Vor diesem lief, ich zwei Befehl in for-Schleife laufe, wie für x in $ set: Befehl Um Zeit zu sparen, möchte ich diese beiden Befehle in derselben lief Zeit, wie Parallelverfahren in Make-DateiPython Multi-Befehl in der gleichen Zeit

Dank Lyn

+1

Lesen Sie über http://docs.python.org/library/threading.html – GWW

+1

Warum verwenden Sie nicht 'subprocess.Popen()'? –

Antwort

3

Das Threading-Modul wird Ihnen aufgrund des Global Interpreter Lock nicht viel Leistung geben.

Ich denke, der beste Weg, dies zu tun ist, das subprocess Modul zu verwenden und jeden Befehl mit seinem eigenen stdout zu öffnen.

processes = {} 
for cmd in ['cmd1', 'cmd2', 'cmd3']: 
    p = subprocess.Popen('cmd1', stdout=subprocess.PIPE) 
    processes[p.stdout] = p 

while len(processes): 
    rfds, _, _ = select.select(processes.keys(), [], []) 
    for fd in rfds: 
     process = processses[fd] 
     print fd.read() 

     if process.returncode is not None: 
      print "Process {0} returned with code {1}".format(process.pid, process.returncode) 
      del processes[fd] 

Sie haben grundsätzlich wählen verwenden, um zu sehen, welche Datei-Deskriptoren bereit sind, und Sie haben ihre Rückkehr zu überprüfen, um zu sehen, ob ein „lesen“ verursacht Tun sie zu verlassen. Prozesse gehen grundsätzlich in einen Wartezustand, bis ihr stdout geschlossen ist. Wenn Sie einige Dinge erledigen möchten, während Sie warten, können Sie eine Zeitüberschreitung bei select.select() setzen, damit Sie nach so langer Zeit nicht mehr warten müssen. Sie können die Länge von RFDs testen und wenn es 0 ist, dann wissen Sie, dass das Timeout passiert ist.

1

twisted oder select Modul ist wahrscheinlich, was Sie suchen.

Wenn alles, was Sie tun möchten, eine Reihe von Batch-Befehle, Shell-Skripte, dh

#!/bin/sh 
for i in "command1 command2 command3"; do 
    $i & 
done 

könnte besser funktionieren. Abwechselnd, ein Makefile wie du gesagt hast.

Verwandte Themen