python 子类化 multiprocessing.Process
我是Python面向对象的新手,我正在将现有的应用程序重写为面向对象的版本,因为现在开发人员在增加,我的代码变得难以维护。
通常我使用多处理队列,但我从这个例子中发现 http://www.doughellmann.com/ PyMOTW/multiprocessing/basics.html 我可以子类 multiprocessing.Process
所以我认为这是一个好主意,我编写了一个类来测试如下:
代码:
from multiprocessing import Process
class Processor(Process):
def return_name(self):
return "Process %s" % self.name
def run(self):
return self.return_name()
processes = []
if __name__ == "__main__":
for i in range(0,5):
p=Processor()
processes.append(p)
p.start()
for p in processes:
p.join()
但是我无法取回值,我如何以这种方式使用队列?
编辑:我想获取返回值并思考将 Queues() 放在哪里。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
子类化
multiprocessing.Process
:Process 需要一个
Queue()
来接收结果...如何子类化multiprocessing.Process
的示例如下...在我的机器上,这会导致...
# Using `multiprocessing.Pool`:
FWIW,我发现子类化
multiprocessing.Process
的一个缺点是您无法利用multiprocessing.Pool
的所有内置优点;如果您不需要生产者和消费者代码通过队列相互通信,Pool
为您提供了一个非常好的 API。您只需使用一些创造性的返回值就可以做很多事情...在下面的示例中,我使用
dict()
封装来自pool_job()
的输入和输出值。 ..结果是:
显然,
pool_job()
中还需要进行大量其他改进,例如错误处理,但这说明了要点。仅供参考,此答案提供了如何使用multiprocessing.Pool
的另一个示例。Subclassing
multiprocessing.Process
:Process needs a
Queue()
to receive the results... An example of how to subclassmultiprocessing.Process
follows...On my machine, this results in...
# Using `multiprocessing.Pool`:
FWIW, one disadvantage I've found to subclassing
multiprocessing.Process
is that you can't leverage all the built-in goodness ofmultiprocessing.Pool
;Pool
gives you a very nice API if you don't need your producer and consumer code to talk to each other through a queue.You can do a lot just with some creative return values... in the following example, I use a
dict()
to encapsulate input and output values frompool_job()
...This results in:
Obviously there are plenty of other improvements to be made in
pool_job()
, such as error handling, but this illustrates the essentials. FYI, this answer provides another example of how to usemultiprocessing.Pool
.非常感谢大家。
现在我是如何完成它的:)
在这个例子中,我使用多个队列,因为我不想在每个队列之间进行通信,而只想与父进程进行通信。
Thanks a lot everyone.
Now heres how i got it done :)
In this example i use multiple queus as i do not want to communicate between each ohter but only with parent process.
Process.run
的返回值不会去任何地方。您需要将它们发送回父进程,例如使用multiprocessing.Queue
(此处的文档)。The return value of
Process.run
doesn't go anywhere. You need to send them back to the parent process, e.g. using amultiprocessing.Queue
(docs here).迈克的答案是最好的,但为了完整起见,我想提一下我更喜欢从<中获取队列code>join contexts 所以最后一点看起来像这样:
Mike's answer is the best, but just for completeness I want to mention that I prefer harvesting the queue out of
join
contexts so the last bit would look like this: