【发布时间】:2020-12-13 06:29:11
【问题描述】:
我有如下代码:
import multiprocessing as mp
connection: module.Connection
def client_id():
for i in range(mp.cpu_count*2):
yield i
def initproc(host: str, port: int, client_id: int):
global connection
connection.connect(host, port, client_id)
def main():
host = "something"
port = 12345
mp.get_context("spawn").Pool(processes=mp.cpu_count()*2,
initializer=initproc,
initargs=(host, port, client_id())) as p:
res = p.starmap(processing_function, arg_list)
就问题而言, processing_function 和 arg_list 不相关。
问题是我收到了一个错误:
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'generator' object
有没有什么方法可以在池中创建一个初始化进程,使得初始化它的参数中的一个是序列中的下一个数字?
附:在编写的代码中,可以在初始化函数之外初始化所有连接对象,但在我的特定实例中它不是。我需要将连接参数传递给初始化程序。
【问题讨论】:
-
有几件事情你应该调查,因为他们可能不会做你认为他们做的事。
global和multiprocessing不要混用 - 每个进程中都会有一个 newconnection。initproc说它期望client_id: int,但您传递的是client_id: Iterable[int](因为client_id()是生成器)。最后,你打算尾随的as p做什么? -
as p允许我将池对象寻址为变量p。global是必需的,因为变量connection否则将在函数内是本地的,并且无法从数据处理函数中访问。Iterable与否我什至没有达到initproc正在获得处理价值的地步
标签: python python-3.x multiprocessing python-multiprocessing process-pool