在python多处理工作池中使用initialize

在python多处理工作池中使用initialize,python,multiprocessing,Python,Multiprocessing,我正在研究工人的multiprocessing.Pool,试图用一些状态初始化工人。池可以接受一个可调用的、初始化的,但它没有传递对已初始化工作进程的引用。我见过的少数几个利用它的例子称为全局变量,这看起来真的很糟糕 有没有什么好方法可以使用multiprocessing.Pool初始化工作状态 编辑:例如: 我有工人,他们每个人都做一些相对昂贵的初始化(绑定到套接字),我不想每次都这样做。我可以手动初始化套接字,然后在分配工作时将它们传递进来,但跨进程共享文件描述符即使不是不可能,也是很复杂的

我正在研究工人的multiprocessing.Pool,试图用一些状态初始化工人。池可以接受一个可调用的、初始化的,但它没有传递对已初始化工作进程的引用。我见过的少数几个利用它的例子称为全局变量,这看起来真的很糟糕

有没有什么好方法可以使用multiprocessing.Pool初始化工作状态

编辑:例如:


我有工人,他们每个人都做一些相对昂贵的初始化(绑定到套接字),我不想每次都这样做。我可以手动初始化套接字,然后在分配工作时将它们传递进来,但跨进程共享文件描述符即使不是不可能,也是很复杂的。因此,每当我想处理一个请求时,我都必须进行初始化和绑定。

从技术上讲,正确的做法是将初始化函数的结果作为参数传递给工人执行的每个函数

同样,在这种情况下,拥有全局变量是安全的,因为通过构造它们会导致私有对象生活在不同进程的不同域中

我的一般建议是使用合理的编程风格构建函数,并在利用
多处理功能的同时允许全局变量

举个例子,下面的
send
函数需要一些上下文(在本例中为套接字):

为方便起见,工人执行的初始化代码和基本代码将依赖于全局变量

socket = None
def init(address, port):
    global socket
    socket = magic(address, port)

def job(data):
    global socket
    assert socket is not None
    return send(socket, data)

pool = multithreading.Pool(N, init, [address, port])
pool.map(job, ['foo', 'bar', 'baz'])
通过以这种方式对其进行编码,无需进行多重处理即可简单自然地对其进行测试。你可以把你的全球状态想象成一个完全安全的环境胶囊


为了方便起见,请记住,
多处理
并不擅长发送复杂数据(例如回调)。最好的方法是发送简单的数据片段(字符串、列表、字典、
collections.namedtuple
…)并在工作端重建复杂的数据结构(使用初始化函数)。

我不太清楚为什么初始化器函数需要引用工作方,也许你可以提供一个稍微具体一点的例子来说明你正在尝试做什么。你知道没有办法知道一个特定的函数调用将被分配给哪个工作者吗?那么,为什么不在函数参数中简单地包含该状态呢?
socket = None
def init(address, port):
    global socket
    socket = magic(address, port)

def job(data):
    global socket
    assert socket is not None
    return send(socket, data)

pool = multithreading.Pool(N, init, [address, port])
pool.map(job, ['foo', 'bar', 'baz'])