我有一个类似于
的python脚本import numpy as np
x = np.array([1,2,3])
y = np.array([2,3,4])
ris1 = function1(x, y) # slow
ris2 = function2(x, y) # slow
ris3 = function3(x, y) # slow
ris = function4(ris1,ris2,ris3)
函数1,2,3不修改值x,y并且它们完全独立。我想开始评估ris2和ris3,即使ris1尚未完成。最后,我想一起使用所有结果。我怎么能这样做?
我知道可以使用joblib
或multiprocessing
模块进行一些并行化,但我希望避免使用map
或for comprehension
语法的复杂性。
答案 0 :(得分:1)
实现异步的可能方式会给代码带来更多复杂性。更好的方法是使用多处理或线程库。在多处理的情况下,如果您不想使用map的语法复杂性,您可以使用如下代码所示的处理方法。我不确定这对你来说是否复杂。
import multiprocessing as mp
import numpy as np
# Define an output queue
output = mp.Queue()
x = np.array([1,2,3])
y = np.array([2,3,4])
def function1(x, y, pos):
output.put((pos, x * y))
def function2(x, y, pos):
output.put((pos, x * y))
def function3(x, y, pos):
output.put((pos, x * y))
# Setup a list of processes that we want to run
processes = [mp.Process(target=function1, args=(x, y, 1, output)),
mp.Process(target=function2, args=(x, y, 2, output)),
mp.Process(target=function3, args=(x, y, 3, output))]
# Run processes
for p in processes:
p.start()
# Exit the completed processes
for p in processes:
p.join()
# Get process results from the output queue
results = [output.get() for p in processes]
results.sort()
results = [r[1] for r in results]
ris = function4(*results)