Python中多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程,这里最Python提供了multiprocessing。通过multiprocessing包可以实现多进程,不过因为不是多线程,无法向多线程一样方便的共享数据[因为多线程往往属于一个进程,进程内共享比较方便]。但是, multiprocessing包也提供了共享变量这样的功能。

multiprocessing中ValueArrayQueue是三个线程和进程安全的共享变量,同时还有Manage()模块可以提供listdict

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()是一个更好的选择。