Python进程中获取multiprocessing Array及引用initargs访问gs变量的方法
嘿,我来帮你搞定这两个Python多进程的问题,结合实际场景给你示例和说明:
问题1:如何在Python进程中获取multiprocessing Array
multiprocessing.Array是基于共享内存的数组,能让多个进程直接读写同一块内存空间,获取它主要有两种常用方式:
方式1:直接作为参数传给子进程
你可以在创建Process对象时,把Array作为参数传给目标函数,子进程就能直接操作它了:
from multiprocessing import Process, Array def worker(shared_arr): # 子进程修改共享数组 shared_arr[1] = 2024 # 读取数组内容 print(f"子进程读取到的数组: {shared_arr[:]}") if __name__ == '__main__': # 创建int类型的共享数组,初始值[0, 0, 0] my_arr = Array('i', [0, 0, 0]) # 启动子进程,把共享数组传进去 p = Process(target=worker, args=(my_arr,)) p.start() p.join() # 主进程查看修改后的结果 print(f"主进程读取到的数组: {my_arr[:]}")
运行后你会发现,子进程对数组的修改,主进程也能看到,这就是共享内存的作用。
方式2:通过初始化函数全局注入(和问题2联动)
如果是用进程池(Pool),可以结合初始化函数把Array注入到每个子进程的全局变量里,这部分刚好对应你的第二个问题。
问题2:在每个进程中访问"gs"变量,如何引用initargs
要让每个子进程都能访问gs变量,核心是用Pool(或者Process)的initializer和initargs参数:initializer是每个子进程启动时会执行的初始化函数,initargs就是传给这个初始化函数的参数,我们可以通过它把需要共享的变量赋值给子进程的全局gs。
举个完整的例子:
from multiprocessing import Pool, Array # 定义全局变量gs,子进程会通过初始化函数赋值 gs = None def init_subprocess(shared_data): # 把传入的共享数据赋值给全局变量gs,每个子进程都会执行这一步 global gs gs = shared_data def process_task(task_id): # 直接访问全局变量gs,操作共享数组 gs[task_id] = task_id * 10 print(f"任务{task_id}修改后的gs: {gs[:]}") if __name__ == '__main__': # 创建共享数组作为要共享的gs数据 shared_arr = Array('i', [0, 0, 0, 0]) # 创建进程池,指定初始化函数和对应的参数(initargs是元组类型) with Pool(initializer=init_subprocess, initargs=(shared_arr,)) as pool: # 给每个子进程分配任务 pool.map(process_task, range(4)) # 主进程查看最终的共享数组状态 print(f"主进程最终结果: {shared_arr[:]}")
注意要点:
- 如果
gs是普通的非共享对象(比如普通列表),那每个子进程的gs都是独立副本,修改不会影响其他进程;如果需要进程间共享修改,一定要用multiprocessing提供的共享对象(Array、Value、Manager等)。 - Windows系统下必须把主逻辑放在
if __name__ == '__main__':里面,不然会触发进程创建的递归问题。 initargs必须是元组类型,哪怕只有一个参数,也要写成(shared_arr,)这样的形式。
内容的提问来源于stack exchange,提问作者xela
相关产品推荐
相关产品推荐

