温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python多进程入门、分布式进程数据共享实例详解

发布时间:2020-09-20 11:22:33 来源:脚本之家 阅读:339 作者:学习笔记666 栏目:开发技术

本文实例讲述了Python多进程入门、分布式进程数据共享。分享给大家供大家参考,具体如下:

python多进程入门

https://docs.python.org/3/library/multiprocessing.html

1、先来个简单的

 # coding: utf-8 from multiprocessing import Process # 定义函数 def addUser(): print("addUser") if __name__ == "__main__": p1 = Process(target=addUser) p1.start() 

多进程包multiprocessing
创建进程p1 = Process(target=函数名);
开始进程p1.start()

2、通过进程ID来区分父子进程

 # coding: utf-8 from multiprocessing import Process import os # 定义一个list myList = ["a","b"]; # 定义函数 def addUser(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"]; # 定义函数 def addUser(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 from multiprocessing import Process, Manager # 定义函数 def addUser(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 from multiprocessing.managers import BaseManager 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 from multiprocessing import Process, Manager from multiprocessing.managers import BaseManager 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数据,看看是不是能够共享?

 # 定义函数 def addUser(list): list.append("c") def addUser2(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程序设计有所帮助。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI