我在调查多处理.池对于workers,尝试使用某种状态初始化Worker。池可以接受可调用的initialize,但不会将引用传递给初始化的worker。我见过的几个利用它的例子叫做全局变量,这看起来真的很糟糕。在
有没有什么好方法可以使用初始化工作进程状态多处理。池?在
编辑:一个例子:
我有工人,每一个工人都要做一个相对昂贵的初始化(绑定到一个套接字),我不想每次都这样做。我可以手动初始化我的套接字,然后在分配工作时将它们传入,但是跨进程共享文件描述符非常复杂,如果不是不可能的话。所以每次我想处理一个请求时都必须初始化和绑定。在
Tags:
从技术上讲,正确的做法是将初始化函数的结果作为参数传递给工人执行的每个函数。在
同样,在这种情况下,使用全局变量是很好和安全的,因为通过构造,它们会导致私有对象生活在不同进程的不同域中。在
我的一般建议是使用合理的reentrant编程风格来构建函数,并在利用
multiprocessing
功能的同时允许使用全局变量。在下面的
send
函数需要一些上下文(在本例中,是一个套接字):为了方便起见,worker执行的初始化代码和基代码将依赖于全局变量。在
^{pr2}$通过这种方式编码,不需要多次处理就可以简单而自然地测试它。你可以把你的全球状态看作是一个完全安全的上下文胶囊。在
为了方便起见,请记住
multiprocessing
并不擅长发送复杂的数据(例如回调)。最好的方法是发送简单的数据片段(字符串、列表、字典、collections.namedtuple
…)并在worker端重建复杂的数据结构(使用初始化函数)。在相关问题 更多 >
编程相关推荐