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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python六大开源框架对比
Oct 19 Python
使用Python神器对付12306变态验证码
Jan 05 Python
Python基于select实现的socket服务器
Apr 13 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
Python多进程原理与用法分析
Aug 21 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Django中的模型类设计及展示示例详解
May 29 Python
浅谈Python中的生成器和迭代器
Jun 19 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
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP内置加密函数详解
2016/11/20 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
python实现绘制树枝简单示例
2014/07/24 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
Python 基础知识之字符串处理
2017/01/06 Python
python文件名和文件路径操作实例
2017/09/29 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
电子信息工程专业自荐书
2014/06/24 职场文书
施工安全汇报材料
2014/08/17 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
学习十八大标语
2014/10/09 职场文书
教师学期个人总结
2015/02/11 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
html中两种获取标签内的值的方法
2022/06/16 jQuery