Python Multiprocessing.Process 如何重用一个进程?

标签 python multithreading multiprocessing

我正在使用 python 多处理模块并行运行一些长时间运行的任务。我正在使用 start() 方法来运行作业,但是作业返回后我想再次运行它们。

是否可以重用我创建的流程?还是每次我想运行作业时都必须创建一个新的 Process 对象?

pyhton 文档中的这一部分建议我不能多次使用 start() 方法,但也许有人知道另一种重用实例的方法:

start()

启动进程的事件。

每个进程对象最多只能调用一次。 它安排在单独的进程中调用对象的 run() 方法。

这是我的 Process 类版本:

class Process(multiprocessing.Process):
    def __init__(self, result_queue, MCMCinstance):
        assert isinstance(MCMCinstance, MCMC)
        multiprocessing.Process.__init__(self)
        self.result_queue = result_queue
        self.mcmc = MCMCinstance
        self.interface = C_interface(self.mcmc)
        self.burn_in = False

    def run(self):
        if self.burn_in: interface.burn_in()
        self.interface.sample(self.mcmc.options.runs)
        self.interface.update(self.mcmc)
        self.result_queue.put(self.mcmc)

然后我实例化进程并使用 start() 方法运行它们:

# setup the jobs and run
result_queue = multiprocessing.Queue()

mcmc1 = MCMC(options, donors, clusters)
mcmc2 = MCMC(options, donors, clusters)
mcmc3 = MCMC(options, donors, clusters)
mcmc4 = MCMC(options, donors, clusters)

p1 = Process(result_queue, mcmc1)
p2 = Process(result_queue, mcmc2)
p3 = Process(result_queue, mcmc3)
p4 = Process(result_queue, mcmc4)

jobs = [p1, p2, p3, p4]

for job in jobs:
    job.start()

results = [result_queue.get() for job in jobs]

最佳答案

要重用进程,您应该使用池。像这样的东西应该可以工作,虽然我还没有测试过。

SENTINEL = "SENTINEL"

class Worker(object):
    def __init__(self, result_queue, MCMCinstance):
        assert isinstance(MCMCinstance, MCMC)
        self.result_queue = result_queue
        self.mcmc = MCMCinstance
        self.interface = C_interface(self.mcmc)
        self.burn_in = False

    def run(self):
        if self.burn_in: interface.burn_in()
        self.interface.sample(self.mcmc.options.runs)
        self.interface.update(self.mcmc)
        #Signal exit by putting SENTINEL in the queue 
        if True:       
            self.result_queue.put(SENTINEL)
        else:
            self.result_queue.put(self.mcmc)

def run(result_queue):
    while True:
        instance = result_queue.get(True)
        if instance == SENTINEL:
            break
        worker = Worker(result_queue, instance)
        worker.run()

if __name__ == "__main__":
    result_queue = multiprocessing.Queue()
    pool = multiprocessing.pool.Pool(3, run, (result_queue,)) # Use a pool with 5 process

    mcmc1 = MCMC(options, donors, clusters)
    mcmc2 = MCMC(options, donors, clusters)
    mcmc3 = MCMC(options, donors, clusters)
    mcmc4 = MCMC(options, donors, clusters)

    result_queue.put(mcmc1)  
    result_queue.put(mcmc2)  
    result_queue.put(mcmc3)  
    result_queue.put(mcmc4)  

    pool.close()
    pool.join()

关于Python Multiprocessing.Process 如何重用一个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23650576/

相关文章:

java - 在 Java 中同步多个异步请求

python - multiprocessing.manager 问题 sys.args

python - 处理图像以查找外部轮廓

c# - 为什么这个任务会立即退出?

multithreading - Java 7 G1GC 奇怪的行为

python - 函数初始化和对象初始化(多处理)

python 非阻塞 recv 与进程之间的管道?

Python 调度算法

python - 如何访问 Odoo docker 容器镜像中的 Odoo 源代码?

python -\b 字符的反义词是什么,即一种不可删除的空格?