python 在后台运行线

标签 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值,它们是完全独立的。即使 ris1 尚未完成,我也想开始评估 ris2 和 ris3。最后我想将所有结果一起使用。我怎样才能做到这一点?

我知道可以使用joblibmultiprocessing模块进行一些并行化,但我想避免使用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/

相关文章:

android - 从 Activity 的 OnCreate 启动的 AsyncTask,仅当此类 AsyncTask 当前未运行时。我该如何实现这个?

python - PyParsing:Combine() 有什么作用?

ios - 串行队列上的 dispatch_async 和 dispatch_sync 之间的区别?

python - numpy python 中的乘法()

java - 如何时不时地查看线程中的值?

java - 并行流中的流操作等到前一个流操作处理完所有元素

c++ - 为什么并行化会如此显着地降低性能?

multithreading - 没有并发怎么能有并行呢?

python - 另一种计算列表中出现次数的方法

python - 如何模拟 open(...).write() 而不会出现 'No such file or directory' 错误?