如何在具有4种不同功能的应用程序中正确实现多处理?

时间:2019-01-03 21:03:40

标签: python python-2.7 python-multiprocessing

看看下面的代码片段。在main函数中,我实例化了一个数组jobsProjects是包含多个project对象的数组。那些project对象还包含多个target对象。对于每个目标,我想执行四个不同的功能。为此,我开始指向功能Process的{​​{1}}。我将run附加到数组并启动它。当前代码段将产生僵尸进程,我试图避免。

Process

目标是处理大约并行处理五个目标,然后在另一个目标完成后使用FIFO等机制处理新目标。

2 个答案:

答案 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。我建议这样做。

  1. 如果您在bash中进行计算,那最好是在Python中完成。
  2. 如果您使用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中。