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

yipeiwu_com7年前Python基础

本文实例讲述了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程序设计有所帮助。

相关文章

Python可变参数会自动填充前面的默认同名参数实例

最近在学习Python的时候遇到一个知识点,在此记录下来 可变参数会自动填充前面的同名默认参数 比如下面这个函数 def add_student(name="Bob", **info...

你还在@微信官方?聊聊Python生成你想要的微信头像

你还在@微信官方?聊聊Python生成你想要的微信头像

今天早上@微信官方突然火了, 一句“请给我一面国旗@微信官方” 刷遍朋友圈。 到底是什么呢? 我们先来看看朋友圈 当然,这只是零零散散的部分截图, 看到这些,一股热血洒了出来, 我兴...

python 域名分析工具实现代码

代码如下: 复制代码 代码如下:import sys, urllib import datetime,time def getDate(): strday=datetime.dateti...

Python实现处理管道的方法

本文实例讲述了Python实现处理管道的方法。分享给大家供大家参考。具体分析如下: Linux下的可以施展的最炫的魔法是什么?相信不同的人说法不同,但是如果没有管道,那么恐怕在绚丽魔法的...

python提取具有某种特定字符串的行数据方法

python提取具有某种特定字符串的行数据方法

今天又帮女朋友处理了一下,她的实验数据,因为python是一年前经常用,最近找工作,用的是c,c++,python的有些东西忘记了,然后就一直催我,说我弄的慢,弄的慢,你自己弄啊,烦不烦...