Share Variable Python Multiprocessing [Python Multiprocessing中的共享变量使用]
Published: Nov. 21, 2020
Python中多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程,这里最Python提供了multiprocessing。通过multiprocessing包可以实现多进程,不过因为不是多线程,无法向多线程一样方便的共享数据[因为多线程往往属于一个进程,进程内共享比较方便]。但是, multiprocessing包也提供了共享变量这样的功能。
multiprocessing中Value
,Array
,Queue
是三个线程和进程安全的共享变量,同时还有Manage()
模块可以提供list
,dict
。
Process
如果使用下面的Process()
方法创建多个process并且进行共享的话,可以使用上述所有的共享变量方式,因为通过Process()
创建的进程本质上是当前进程的子进程。
import multiprocessing
def func(num_arg):
print(num_arg.value)
if __name__ == '__main__':
num = multiprocessing.Value('i', 1)
p = multiprocessing.Process(target=func, args=(num,))
p.start()
p.join()
Process Pool
如果是通过Pool()
创建进程池,并共享变量的话,因为进程池内进程关系并非父子进程,无法使用上文方式。想要共享,必须使用Manager()
模块来定义。也就是说只能进程池只能共享Manager().list()
和Manager().dict()
Conclusion
就个人使用经验来说,Manager()
是一个更强大更安全的模块,如果想进行进程间共享变量,使用Manager()
是一个更好的选择。