python中一个变量是如何穿梭于多线程与多进程?( 二 )


 
它的输出结果是:

python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
最后的输出是0,说明了子进程对于主进程传入的Data对象操作其实对于主进程的对象是不起作用的,我们需要怎样的操作才能实现子进程可以操作主进程的对象呢?我们可以使用multiprocessing.managers 下的 BaseManager 来实现
python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
使用from multiprocessing.managers import BaseManager 引入 BaseManager以后,在定义完Data类型之后,使用BaseManager.register("mydata",Data) 将Data类型注册到BaseManager中,并且给了它一个名字叫mydata,之后就可以使用BaseManager对象的这个名字来初始化对象,我们来看一下输出
python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
我们看到,虽然在每个子进程中使用的是不同的对象,但是它们的值却是可以“共享”的 。
标准的数据类型也可以通过multiprocessing库中的Value对象,举一个简单的例子
python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
这里使用d = multiprocessing.Value("l",10) 初始化了一个数字类型的对象,这个类型是Synchronized wrApper for c_long ,multiprocessing.Value在初始化时,第一个参数是类型,第二个参数是值,具体支持的类型如下
python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
还可以使用ctypes库里和类初始化字符串
>>> from ctypes import c_char_p>>> s = multiprocessing.Value(c_char_p, b'\xd1\xee\xd1\xe5\xd0\xc7')>>> print(s.value.decode('gbk'))杨彦星ctypes里的类型与Python的对应关系如下:
python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
还可以使用Manager对象初始list,dict等
python中一个变量是如何穿梭于多线程与多进程?

文章插图
 
其实我们这里所说的共享只是数据值上的共享,因为在多进程中,各自持有的对象都不相同,所以如果想要同步状态需要另辟蹊径 。不过这种在自己写的小项目中可以简单的使用,如果做一些大一点的项目,还是建议不要使用这种共享数据的方式,这种大大的增加了程序间的耦合性,使用逻辑变得复杂难懂,所以建议还是使用队列或者数据库作为进程间通信的渠道 。
参考文章
Python 进程之间共享数据(全局变量)
Python多进程编程-进程间共享数据

【python中一个变量是如何穿梭于多线程与多进程?】


推荐阅读