我使用python多处理模块并行运行一些长时间运行的任务。我使用start()方法运行作业,但是一旦作业返回,我想再次运行它们。在
是否可以重用我创建的流程?还是每次运行作业时都必须创建一个新的进程对象?在
Pyton文档中有一节建议我不能使用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()方法运行它们:
^{pr2}$
要重用流程,您应该使用池。像这样的东西应该行得通,不过我还没有测试过。在
不,不可能。在^{} 中有一个特定的防范措施。在
我只能推测为什么它不可重用,但我认为这是一个设计选择。它可能会给类添加太多的逻辑来回收对象,这是值得的。但我觉得更有趣的是,问为什么会这样。在
不过,在阅读了过去20分钟的源代码之后,我可以肯定地说,仅仅创建整个python进程的一个分支,比创建一个对象的新实例要花更多的时间,所以从性能上讲,这一点都不重要。在
至于您的代码,您可以稍微压缩一下,您不必使用命名的
Process
实例,并利用列表理解。在编辑: 我也认为你有点误用} 和
Queue
这是为了在进程之间进行通信,我想你不需要它。要创建线程池,应该使用^{Pool.map
。但是我不能给出确切的代码示例,没有看到原始的目标函数。我认为这需要调整。在正如文档所说,您只能调用一次.start()方法,我相信每次都必须创建新的进程:
相关问题 更多 >
编程相关推荐