您的位置:首页 > 编程语言 > Python开发

python多进程入门、分布式进程数据共享

2017-11-22 15:49 537 查看

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添加数据有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: