2012-08-26 13 views
6

Ich habe Python-Skript run.py:Run mehr Python-Programme zur gleichen Zeit

def do(i): 
    # doing something with i, that takes time 

start_i = sys.argv[1] 
end_i = sys.argv[2] 
for i in range(start_i, end_i): 
    do(i) 

Dann laufe ich dieses Skript:

python run.py 0 1000000 

Nach 30 Minuten Skript beendet ist. Aber es ist zu lang für mich.

python run.py 0 200000 & 
python run.py 200000 400000 & 
python run.py 400000 600000 & 
python run.py 600000 800000 & 
python run.py 800000 1000000 

Dann laufe ich dieses Skript:

bash run.sh 

Nach 6 Minuten Skript abgeschlossen ist

Also, ich Bash-Skript run.sh erstellen. Eher gut. Ich bin froh.

Aber ich denke, es gibt einen anderen Weg, um das Problem zu lösen (ohne Bash-Skript zu erstellen), nicht wahr?

Antwort

10

Sie sind für das multiprocessing Paket suchen, und vor allem die Pool Klasse:

from multiprocessing import Pool 
p = Pool(5) # like in your example, running five separate processes 
p.map(do, range(start_i, end_i)) 

hinaus in einen einzigen Befehl zu konsolidieren, hat diese andere Vorteile gegenüber Ihrem Ansatz des Aufrufs python run.py 0 200000 & etc. Wenn einig Prozesse nehmen länger als andere (und daher python run.py 0 200000 könnte vor den anderen enden), wird dies sicherstellen, dass alle 5 Threads funktionieren, bis alle von ihnen fertig sind.

Beachten Sie, dass abhängig von der Architektur Ihres Computers zu viele Prozesse gleichzeitig verlangsamt werden können (für den Anfang hängt es davon ab, wie viele Kerne Ihr Prozessor hat und was Sie sonst noch gleichzeitig ausführen) Zeit).

+0

Ich habe es gerade versucht. Es funktioniert so gut! Vielen Dank – imkost

+0

Sie sind herzlich willkommen –

+1

@imkost: Wenn Sie nicht die 'p.map()' s zurückgegebene Werte verwenden, dann könnten Sie 'für _ in p.imap_unordered (do, range (start_i, end_i)): pass '. – jfs

0

Sie könnten Ihr Python-Programm die unabhängigen Prozesse erstellen lassen, anstatt es bash zu tun, aber das ist nicht viel anders. Was ist an Ihrer Lösung, die Sie als mangelhaft empfinden?

+0

Ich möchte nur ein Python-Skript haben – imkost

+0

@imkost: und Sie können nicht 'python run.py 0 1000000' tun? –

+0

@JoelCornett: das dauert zu viel Zeit, um das Skript zu vervollständigen – imkost

Verwandte Themen