python在背景中运行线

时间:2015-04-07 18:06:47

标签: python multithreading parallel-processing

我有一个类似于

的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尚未完成。最后,我想一起使用所有结果。我怎么能这样做?

我知道可以使用joblibmultiprocessing模块进行一些并行化,但我希望避免使用mapfor comprehension语法的复杂性。

1 个答案:

答案 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)
相关问题