本文实例讲述了python多进程入门、分布式进程数据共享。分享给大家供大家参考,具体如下:
python多进程入门
https://docs.python.org/3/library/multiprocessing.html
1、先来个简单的
1
2
3
4
5
6
7
8
|
# 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来区分父子进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 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、主进程等等子进程执行完毕
1
2
3
4
5
6
7
8
9
10
|
# 定义一个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)
执行。
在主进程里,只需要加一句代码:
1
2
|
p1.join() # 等待子进程执行完毕
print (mylist)
|
['a', 'b', 'c']
['a', 'b']
执行的顺序就不一样了。
分布式进程数据共享
通过manager
实现数据共享。
manager会创建一个服务进程,其他的进程都统一来访问这个server进程,从而达到多进程之间的数据通信。
一旦主进程结束,则server进程也讲结束
1、不多说,直接上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 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内容如下:
1
2
3
4
5
6
7
8
|
# 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
1
2
3
4
5
6
7
8
9
|
# 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数据,看看是不是能够共享?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 定义函数
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程序设计有所帮助。
原文链接:https://blog.csdn.net/github_26672553/article/details/78603539