我遇到了以下问题:
我有两个不同的班级;我们称之为interface
和worker
。接口应该接受来自外部的请求,并将它们多路复用到多个工作者。
与我发现的几乎所有例子相反,我有几个特点:
workers[0]
无法回答workers[1]
的请求。这种多路复用在interface
。例如,假设每个worker正在存储一个整数(假设该worker接收的调用次数)。在非并行处理中,我会使用类似的东西:
class interface(object):
workers = None #set somewhere else.
def get_worker_calls(self, worker_id):
return self.workers[worker_id].get_calls()
class worker(object)
calls = 0
def get_calls(self):
self.calls += 1
return self.calls
这显然不起作用。是什么?
或者,或许更相关,我没有多处理经验。我是否缺少一种可以轻松解决上述问题的设计范式?
谢谢!
作为参考,我考虑了几种方法,但我找不到一个好的方法:
interface
'(使其可扩展性很差),或者要求我发送额外信息。答案 0 :(得分:0)
多处理意味着您有2个以上的独立进程在运行。无法直接从一个进程访问内存(如多线程)。
您最好的方法是使用某种外部队列机制,您可以从Celery或RQ开始。 RQ更简单,但芹菜内置监控。
但是你必须知道,只有当Celery / RQ能够“打包”所需的函数/类并将它们发送到其他进程时,Multiprocessing才会起作用。因此,您必须使用__main__级别的函数(位于文件顶部,不属于任何类)。
你总是可以自己实现,Redis很简单,ZeroMQ和RabbitMQ也很好。
Beaver library是如何使用ZeroMQ队列处理python中的多处理的好例子。