本文实例讲述了Python多进程入门,分布式进程数据共享。分享给大家供大家参考,具体如下:
https://docs.python.org/3/library/multiprocessing.html
1,先来个简单的
utf - 8编码: 从多处理导入过程 #定义函数 def addUser (): print (“addUser”) if __name__==癬_main__”: p1=过程(目标=addUser) p1.start () >之前多进程包<代码>多处理> 代码;
创建进程<代码> p1=过程(目标=函数名)代码>,
开始进程<代码> p1.start() 代码>。2,通过进程ID来区分父子进程
utf - 8编码: 从多处理导入过程 进口操作系统 #定义一个列表 myList=(“a”、“b”); #定义函数 def addUser(列表): print (os.getpid()) #进程ID print (os.getppid()) #父进程ID if __name__==癬_main__”: p1=过程(目标=addUser, args=(myList,)) p1.start () #这里是主进程 打印(“父进程ID: " + str (os.getpid())) #进程ID >之前父进程ID: 27084
引用>
27085年
27084年3,主进程等等子进程执行完毕
#定义一个列表 myList=(“a”、“b”); #定义函数 def addUser(列表): list.append (“c”) print(列表) if __name__==癬_main__”: p1=过程(目标=addUser, args=(myList,)) p1.start () 打印(myList) >之前[a, b]
引用>
[' a ', ' b ', ' c ']主线程的<代码>打印(myList) 代码>先于子进程的<代码>打印(列表)代码>执行。
在主进程里,只需要加一句代码:
p1.join() #等待子进程执行完毕 打印(myList) >之前[' a ', ' b ', ' c ']
引用>
[a, b]执行的顺序就不一样了。
通过<代码> 代码>经理实现数据共享。
经理会创建一个服务进程,其他的进程都统一来访问这个服务器进程,从而达到多进程之间的数据通信。
一旦主进程结束,则服务器进程也讲结束
1,不多说,直接上代码
utf - 8编码: 从多处理导入过程,经理 #定义函数 def addUser(列表): list.append (“c”) #给列表添加了一个元素 print(列表) if __name__==癬_main__”: 下=经理() my_list=mgr.list ([“a”、“b”]) #通过经理对象创建列表 p1=过程(目标=addUser, args=(my_list,)) p1.start () p1.join () 打印(my_list) >之前注意2次打印列表,在子进程(addUser())里还改变了列表数据。我们看看2次打印结果:
[' a ', ' b ', ' c ']
引用>
[' a ', ' b ', ' c ']说明通过经理对象创建的表数据能够在进程之间通信了。
2,分布式的数据共享
https://docs.python.org/3/library/multiprocessing.html2.1,创建一个服务器
datamgr.py内容如下:
utf - 8编码: 多处理。经理进口BaseManager if __name__==癬_main__”: 下=BaseManager(地址=(127.0.0.1,50000),authkey=b 'password”) 经理注册(“getUser”,可调用=λ:[“a”、“b”)) #服务器永不关闭 服务器=mgr.get_server () server.serve_forever () >之前作为数据提供者。
2.2,在test.py里(可能是另外一台服务器里)连接这个服务器
utf - 8编码: 从多处理导入过程,经理 多处理。经理进口BaseManager if __name__==癬_main__”: 下=BaseManager(地址=(127.0.0.1,50000),authkey=b 'password”) mgr.register (“getUser”) mgr.connect() #连接远程的服务器 my_list=mgr.getUser() #从服务器获取数据 打印(my_list) # [a, b] >之前连上了,并获取到了数据。
3,创建2个子进程,修改列表数据,看看是不是能够共享?
#定义函数 def addUser(列表): list.append (“c”) def addUser2(列表): list.append (“d”) if __name__==癬_main__”: 下=BaseManager(地址=(127.0.0.1,50000),authkey=b 'password”) mgr.register (“getUser”) mgr.connect() #连接远程的服务器 my_list=mgr.getUser() #从服务器获取数据 #创建2个子进程 p1=过程(目标=addUser, args=(my_list,)) p1.start () p2=过程(目标=addUser2 args=(my_list,)) p2.start () #等待2个子进程执行完毕 p1.join () p2.join () #在主进程打印最终的列表 打印(my_list) # [a, b, c, d的)Python多进程入门,分布式进程数据共享实例详解