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中字符串对齐方法介绍
May 21 Python
Python的Django框架可适配的各种数据库介绍
Jul 15 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
几种实用的pythonic语法实例代码
Feb 24 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
python实现中文文本分句的例子
Jul 15 Python
基于python使用tibco ems代码实例
Dec 20 Python
python切割图片的示例
Nov 12 Python
python中uuid模块实例浅析
Dec 29 Python
python线程优先级队列知识点总结
Feb 28 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
如何利用opencv判断两张图片是否相同详解
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
PHP的栏目导航程序
2006/10/09 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
PHP生成RSS文件类实例
2014/12/05 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
VUE实现吸底按钮
2021/03/04 Vue.js
python with statement 进行文件操作指南
2014/08/22 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
高二英语教学反思
2014/01/19 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
药品开票员岗位职责
2015/04/15 职场文书
后天观后感
2015/06/08 职场文书
Python中rapidjson参数校验实现
2021/07/25 Python
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript