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感谢您的回复。有什么参考资料我可以查一下吗?非常感谢。