gpt4 book ai didi

python - 使用顺序初始化参数的多进程池初始化

转载 作者:行者123 更新时间:2023-12-04 09:01:01 24 4
gpt4 key购买 nike

我有一些代码如下:

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

有没有什么方法可以在池中创建一个初始化进程,使得初始化它的参数之一将是序列中的下一个数字?

附言在所写的代码中,可以在初始化函数之外初始化所有连接对象,但在我的特定实例中它不是。我需要将连接参数传递给初始化程序。

最佳答案

针对您的情况,一个简单的解决方案是使用 Process.name 中包含的子进程的序号。你可以用...提取它

mp.current_process().name.split('-')[1]

如果您需要更好地控制序列的开始位置,您可以使用 multiprocessing.Value 作为计数器,工作人员从中获取其唯一编号。

import multiprocessing as mp
import time


def init_p(client_id):
with client_id.get_lock():
globals()['client_id'] = client_id.value
print(f"{mp.current_process().name},"
f" {mp.current_process().name.split('-')[1]}," # alternative
f" client_id:{globals()['client_id']}")
client_id.value += 1


if __name__ == "__main__":

ctx = mp.get_context("spawn")
client_ids = ctx.Value('i', 0)

with ctx.Pool(
processes=4,
initializer=init_p,
initargs=(client_ids,)
) as pool:

time.sleep(3)

输出:

SpawnPoolWorker-2, 2, client_id:0
SpawnPoolWorker-3, 3, client_id:1
SpawnPoolWorker-1, 1, client_id:2
SpawnPoolWorker-4, 4, client_id:3

Process finished with exit code 0

关于python - 使用顺序初始化参数的多进程池初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63564028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com