看看下面的代码片段。在main
函数中,我实例化了一个数组jobs
。 Projects
是包含多个project
对象的数组。那些project
对象还包含多个target
对象。对于每个目标,我想执行四个不同的功能。为此,我开始指向功能Process
的{{1}}。我将run
附加到数组并启动它。当前代码段将产生僵尸进程,我试图避免。
Process
目标是处理大约并行处理五个目标,然后在另一个目标完成后使用FIFO等机制处理新目标。
答案 0 :(得分:0)
传递处理功能是您进行迭代的集合的一部分:
from multiprocessing import Pool
def fun(*args)
proc, p, q = args
return proc(p, q)
data = [(f, x, y) for f in (a, b, c, d)]
pool = Pool(4)
results = pool.map(fun, data)
答案 1 :(得分:0)
根据您的评论,我收集到您正在函数bash
.. a
中调用d
。我建议不这样做。
bash
中进行计算,那最好是在Python中完成。bash
启动程序,那么最好直接在Python中完成。如果可以使用python 3,我建议您使用concurrent.futures.ThreadPoolExecutor
来使一堆线程遍历您的数据。然后,您可以在每个线程中使用subprocess
模块来启动外部程序。
我的dicom2jpg.py脚本是如何执行此操作的示例。它并行运行ImageMagick的convert
程序,以将DICOM X射线图像转换为PNG格式。
如果您需要使用Python 2.7,那么我将列出一个子进程(通过调用subprocess.Popen
)。不断迭代此列表,并检查子进程是否已完成。如果是这样,请将其从列表中删除。如果尚未用完任务,请启动一个新的子流程并将其附加到列表中。该列表应具有与您的计算机具有内核一样多的子进程。一般情况下,没有更多用处。
这种方法显示在older version of dicom2png.py
中。