Python多进程入门、分布式进程数据共享实例详解
本文实例讲述了Python多进程入门、分布式进程数据共享。分享给大家供大家参考,具体如下:
python多进程入门
https://docs.python.org/3/library/multiprocessing.html
1、先来个简单的
#coding:utf-8 frommultiprocessingimportProcess #定义函数 defaddUser(): print("addUser") if__name__=="__main__": p1=Process(target=addUser) p1.start()
多进程包multiprocessing;
创建进程p1=Process(target=函数名);
开始进程p1.start()。
2、通过进程ID来区分父子进程
#coding:utf-8 frommultiprocessingimportProcess importos #定义一个list myList=["a","b"]; #定义函数 defaddUser(list): print(os.getpid())#进程ID print(os.getppid())#父进程ID if__name__=="__main__": p1=Process(target=addUser,args=(myList,)) p1.start() #这里是主进程 print("父进程ID:"+str(os.getpid()))#进程ID
父进程ID:27084
27085
27084
3、主进程等等子进程执行完毕
#定义一个list myList=["a","b"]; #定义函数 defaddUser(list): list.append("c") print(list) if__name__=="__main__": p1=Process(target=addUser,args=(myList,)) p1.start() print(myList)
['a','b']
['a','b','c']
主线程的print(myList)先于子进程的print(list)执行。
在主进程里,只需要加一句代码:
p1.join()#等待子进程执行完毕 print(myList)
['a','b','c']
['a','b']
执行的顺序就不一样了。
分布式进程数据共享
通过Manager实现数据共享。
Manager会创建一个服务进程,其他的进程都统一来访问这个server进程,从而达到多进程之间的数据通信。
一旦主进程结束,则server进程也讲结束
1、不多说,直接上代码
#coding:utf-8 frommultiprocessingimportProcess,Manager #定义函数 defaddUser(list): list.append("c")#给list添加了一个元素 print(list) if__name__=="__main__": mgr=Manager() my_list=mgr.list(["a","b"])#通过Manager对象创建list p1=Process(target=addUser,args=(my_list,)) p1.start() p1.join() print(my_list)
注意2次打印list,在子进程(addUser())里还改变了list数据。我们看看2次打印结果:
['a','b','c']
['a','b','c']
说明通过Manager对象创建的list数据能够在进程之间通信了。
2、分布式的数据共享
https://docs.python.org/3/library/multiprocessing.html
2.1、创建一个server
datamgr.py内容如下:
#coding:utf-8 frommultiprocessing.managersimportBaseManager if__name__=="__main__": mgr=BaseManager(address=('127.0.0.1',50000),authkey=b'password') mgr.register("getUser",callable=lambda:["a","b"]) #server永不关闭 server=mgr.get_server() server.serve_forever()
作为数据提供者。
2.2、在test.py里(可能是另外一台服务器里)连接这个server
#coding:utf-8 frommultiprocessingimportProcess,Manager frommultiprocessing.managersimportBaseManager if__name__=="__main__": mgr=BaseManager(address=('127.0.0.1',50000),authkey=b'password') mgr.register("getUser") mgr.connect()#连接远程的server my_list=mgr.getUser()#从server获取数据 print(my_list)#['a','b']
连上了,并获取到了数据。
3、创建2个子进程,修改list数据,看看是不是能够共享?
#定义函数 defaddUser(list): list.append("c") defaddUser2(list): list.append("d") if__name__=="__main__": mgr=BaseManager(address=('127.0.0.1',50000),authkey=b'password') mgr.register("getUser") mgr.connect()#连接远程的server my_list=mgr.getUser()#从server获取数据 #创建2个子进程 p1=Process(target=addUser,args=(my_list,)) p1.start() p2=Process(target=addUser2,args=(my_list,)) p2.start() #等待2个子进程执行完毕 p1.join() p2.join() #在主进程打印最终的list print(my_list)#['a','b','c','d']
显然,在子进程里往list添加数据有效。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。