我有一个类似于的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值,它们是完全独立的。即使 ris1 尚未完成,我也想开始评估 ris2 和 ris3。最后我想将所有结果一起使用。我怎样才能做到这一点?
我知道可以使用joblib
或multiprocessing
模块进行一些并行化,但我想避免使用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)
关于python 在后台运行线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29498212/