【记录】Python多进程编程学习

123zdq / 2024-07-18 / 原文

最近在学习我们UAV实验用的代码,用Python多进程(multiprocessing)实现了A3C(多Agent异步计算),之前并未接触过这方面的知识,并且也想实现一个多Agent的(同步/异步等待研究,但原论文提到的看上去像是同步的)PPO算法实现,自然就开始探究Python多进程编程的细节

补充材料 https://blog.csdn.net/YZL40514131/article/details/127233709

在windows中Process()必须放到if __name__ == '__main__':

隔离

问题1:通过Process方法创建进程函数,args传递的参数是怎样的?会是深复制吗?子进程会修改到原来进程里面的变量吗?
通过如下代码做实验

import torch.multiprocessing as mp
import copy
def func(x):
    print("----------------")
    print(x)
    print(id(x))
    x[0]=int(time.time())
    print(x)
    print(id(x))

if __name__ == '__main__':
    import copy
    a=[1,2,3,4,5,6,7]
    print(id(a))
    func(copy.deepcopy(a))
    print('qqq')
    time.sleep(1)
    mp.Process(target=func,args=(a,)).start()
    time.sleep(1)
    mp.Process(target=func,args=(copy.deepcopy(a),)).start()
    time.sleep(1)
    mp.Process(target=func,args=(a,)).start()
    time.sleep(1)
    print(a)
    print(id(a))
    input()

结论

  • 创建的子进程相当于新内存空间上的“分身”,变量不共享(虽然id都一样)(无需担心Python的浅复制传参影响到不同进程)
  • id返回的是虚拟标识符而不是真实物理地址,无法区分不同进程的“同一个”量

实际上对于小整数这样的“常量”,在不同子进程间也是共享的,不过并不影响进程间的隔离性

交互

实现进程间数据通信有两种方式,待研究
https://blog.csdn.net/houyanhua1/article/details/78244288/
https://blog.csdn.net/lechunluo3/article/details/79005910