本文实例讲述了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程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。