2016-04-08 21 views
0

Ich kämpfe ein bisschen mit etwas, das eigentlich ganz einfach sein sollte. Ich habe eine Funktion, die einige lange Berechnung der Fall ist, vereinfachen es so loks:Python - einfachste Möglichkeit, Funktionen parallel zu betreiben

import time  
def compute_stuff(number): 
    time.sleep(10) 
    return [number*2, number*4] 

Ich möchte zwei Instanzen dieser Funktion parallel laufen zu lassen und ihre Ergebnisse in einem Array sammeln. Ich habe ein wenig über Twisted-Reaktor gelesen und es scheint, asynchrones Abfragen zu liefern, aber alles in einem Thread ausgeführt wird, so, wenn ich zB:

from twisted.internet import reactor 
import time 

def compute_stuff(number): 
    time.sleep(10) 
    return [number*2, number*4] 

reactor.callWhenRunning(compute_stuff, 1) 
reactor.callWhenRunning(compute_stuff, 4) 
reactor.callWhenRunning(compute_stuff, 2) 
reactor.run() 

Es wartet auf den ersten Anruf zu beenden, bevor die nächste Ausführung . Gibt es eine Möglichkeit, es parallel zu machen? Ist Twisted sogar der Weg zu gehen?

Antwort

2

Sie das Threading-Modul versuchen

import threading 
import time  

def compute_stuff(number): 
    print str(number) + "start" 
    time.sleep(10) 
    print str(number) + "end" 
    return [number*2, number*4] 


threads = [] 
for i in range(5): 
    t = threading.Thread(target=compute_stuff, args=(i,)) 
    threads.append(t) 
    t.start() 
0

Mit task Sie können sie in Abständen wie laufen:

from twisted.internet import task 
from twisted.internet import reactor 
import time 

def compute_stuff(number): 
    time.sleep(10) 
    return [number*2, number*4] 

t1 = task.callWhenRunning(compute_stuff, 1) 
t2 = task.callWhenRunning(compute_stuff, 4) 
t3 = task.callWhenRunning(compute_stuff, 2) 

t1.start(10) #run every 10 seconds 
t2.start(10) 
t3.start(10) 

reactor.run() 

Aber ich bin mir nicht sicher über Themen ...