python多处理池将对象分配给工作者
我有一些东西需要处理。我想知道是否有办法根据唯一键将工作(流程)分配给对象。python多处理池将对象分配给工作者,python,Python,我有一些东西需要处理。我想知道是否有办法根据唯一键将工作(流程)分配给对象。 当代码第一次看到对象时,应随机为其分配一个工作者,但如果该对象再次出现,则应将其分配给之前处理该对象的工作者。谢谢你 例如: 工作者A、B、C |第一束对象1,2,3,4第二束对象1,3 第一批对象: worker A实现“粘性会话”的一个非常简单的方法是创建自己版本的多处理.Pool,它不急于分配工作项,而是确定地分配工作项。以下是一个不完整但可运行的解决方案: import multiprocessing impo
当代码第一次看到对象时,应随机为其分配一个工作者,但如果该对象再次出现,则应将其分配给之前处理该对象的工作者。谢谢你
例如:
工作者A、B、C |第一束对象1,2,3,4第二束对象1,3
第一批对象:
worker A实现“粘性会话”的一个非常简单的方法是创建自己版本的
多处理.Pool
,它不急于分配工作项,而是确定地分配工作项。以下是一个不完整但可运行的解决方案:
import multiprocessing
import os
import time
def work(job):
time.sleep(1)
print "I am process", os.getpid(), "processing job", job
class StickyPool:
def __init__(self, processes):
self._inqueues = [multiprocessing.Queue() for ii in range(processes)]
self._pool = [multiprocessing.Process(target=self._run, args=(self._inqueues[ii],)) for ii in range(processes)]
for process in self._pool:
process.start()
def map(self, fn, args):
for arg in args:
ii = hash(arg) % len(self._inqueues)
self._inqueues[ii].put((fn, arg))
def _run(self, queue):
while True:
fn, arg = queue.get()
fn(arg)
pool = StickyPool(3)
#pool = multiprocessing.Pool(3)
pool.map(work, [1,2,3,4,1,2,3,4,1,2,3,4])
time.sleep(4)
使用上述
粘滞池时,作业将根据其参数的散列进行分配。这意味着每次都有相同的参数进入相同的进程。如果有许多独特值的散列发生冲突,那么均匀分配作业是不够明智的,但是,哦,好吧,未来还有改进的余地。我也不关心关机逻辑,因此如果使用StickyPool
,程序不会停止运行,但是如果使用多处理.Pool
,程序会停止运行。解决这些问题并实现更多的池
接口(如apply()
,以及从map()
返回结果)留作练习。一个经常用来描述您所寻找的术语是“粘性会话”。@JohnZwinck感谢您的回复。有什么参考资料我可以查一下吗?非常感谢。