python多进程实现进程间通信实例


Posted in Python onNovember 24, 2017

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

multiprocessing.Queue()

以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

multiprcessing.Queue.put() 为 入队操作

multiprcessing.Queue.get() 为 出队操作

队列 线程 和 进程 安全

put(obj[, block[, timeout]])

将obj放入队列。 如果可选参数 block为True(默认值),timeout为None(默认值),则必要时阻止,直到空闲插槽可用。 如果超时是正数,它将阻止最多超时秒数,如果在该时间内没有空闲插槽可用,则会引发Queue.Full异常。 否则(块为False),如果空闲插槽立即可用,则将一个项目放在队列中,否则会引发Queue.Full异常(在这种情况下,忽略超时)。

get([block[, timeout]])

从队列中删除并返回一个项目。 如果可选的args块为True(默认值),超时为None(默认值),则在必要时阻止,直到项目可用。 如果超时为正数,则它将阻塞至多超时秒数,并在该时间内没有可用项目时引发Queue.Empty异常。 否则(block为False),如果一个项目立即可用,返回一个项目,否则会引发Queue.Empty异常(在这种情况下,忽略超时)。

#- * -coding: utf - 8 - * -
  from multiprocessing
import Process, Queue
import os
import time
import random


# 写数据进程执行的代码:
  def write(q):
  print('Process to write: %s' % os.getpid())
for value in ['A', 'B', 'C']:
  print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())

# 读数据进程执行的代码:
  def read(q):
  print('Process to read: %s' % os.getpid())
while True:
  value = q.get()
print('Get %s from queue.' % value)

if __name__ == '__main__': #父进程创建Queue, 并传给各个子进程:
q = Queue()
pw = Process(target = write, args = (q, ))
pr = Process(target = read, args = (q, ))# 启动子进程pw, 写入:
  pw.start()# 启动子进程pr, 读取:
  pr.start()# 等待pw结束:
  pw.join()# pr进程里是死循环, 无法等待其结束, 只能强行终止:
  pr.terminate()

输出

Process to read: 5836
Process to write: 6472
Put A to queue...
Put B to queue...
Get A from queue.
Put C to queue...
Get B from queue.
Get C from queue.

Process finished with exit code 0

multiprocessing.Pipe()

Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。

Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。 当然,同时使用管道不同端的过程也不会有风险。

返回表示管道末端的一对Connection(conn1,conn2)对象。

如果duplex为True(默认),则管道是双向的。

如果duplex是False,那么管道是单向的:conn1只能用于接收消息,conn2只能用于发送消息。

#- * -coding: utf - 8 - * -
  from multiprocessing
import Process, Pipe

def f(conn):
  conn.send([42, None, 'hello'])
while True:
  print(conn.recv())

if __name__ == '__main__':
  parent_conn, child_conn = Pipe()
p = Process(target = f, args = (child_conn, ))
p.start()
print parent_conn.recv()# prints "[42, None, 'hello']"
parent_conn.send('666')
p.terminate()

输出:

[42, None, 'hello']
666

Process finished with exit code 0

总结

以上就是本文关于python多进程实现进程间通信实例的全部内容,希望对大家有所帮助。感兴趣的朋友可继续参阅本站:

如有不足之处,欢迎留言指出。

Python 相关文章推荐
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
Python pickle模块用法实例
Apr 14 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
Django密码存储策略分析
Jan 09 Python
使用python客户端访问impala的操作方式
Mar 28 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
Python通过len函数返回对象长度
Oct 22 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
python批量创建变量并赋值操作
Jun 03 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 #Python
Python二叉树的定义及常用遍历算法分析
Nov 24 #Python
详解python上传文件和字符到PHP服务器
Nov 24 #Python
Python实现矩阵转置的方法分析
Nov 24 #Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 #Python
利用python3随机生成中文字符的实现方法
Nov 24 #Python
Python内置函数 next的具体使用方法
Nov 24 #Python
You might like
推荐文章系统(一)
2006/10/09 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
培养自己的php编码规范
2015/09/28 PHP
DOM 基本方法
2009/07/18 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
个人委托书怎么写
2014/04/04 职场文书
地方白酒代理协议书
2014/10/25 职场文书
现役军人家属慰问信
2015/03/24 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
JavaScript实现栈结构详细过程
2021/12/06 Javascript
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers
JS实现简单九宫格抽奖
2022/06/28 Javascript