2016-04-08 1 views
0

Je me bats un peu avec quelque chose qui devrait en fait être assez simple à faire. J'ai une fonction qui fait un peu de calcul long, pour simplifier loks comme ceci:Python - le moyen le plus simple possible d'exécuter des fonctions en parallèle

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

Je veux exécuter deux instances de cette fonction en parallèle et recueillir leurs résultats dans un tableau. J'ai lu un peu réacteur tordu et il semble fournir des requêtes asynchrones, mais exécute tout en un seul fil quand je fais par exemple:

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

Il attend que le premier appel à remplir avant d'exécuter le suivant . Y a-t-il un moyen de le rendre parallèle? Twisted est-il même le chemin à parcourir?

Répondre

2

Vous pouvez essayer le module de filetage

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

Avec task Vous pouvez les exécuter dans des intervalles tels que:

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

Mais je ne suis pas sûr de discussions ...