2016-04-08 3 views
0

Я немного борюсь с чем-то, что на самом деле должно быть довольно простым. У меня есть функция, которая делает некоторые длинные вычисления, чтобы упростить его Локс, как это:Python - самый простой способ запуска параллельных функций

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

Я хочу запустить два экземпляра этой функции параллельно и свои результаты в одном массиве. Я прочитал немного о Twisted реактора и, кажется, обеспечивают асинхронные запросы, но работает все в одном потоке, поэтому, когда я, например:

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

Он ждет первого звонок, чтобы завершить перед выполнением следующего одного , Есть ли способ сделать это параллельным? Свернуто ли даже путь?

ответ

2

Вы можете попробовать модуль поточной

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

С task Вы можете запустить их в интервалах, как:

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

Но я не уверен, резьб ...

Смежные вопросы