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的Django框架下管理站点的基本方法
Jul 17 Python
Python切换pip安装源的方法详解
Nov 18 Python
解决python2.7用pip安装包时出现错误的问题
Jan 23 Python
Python 多核并行计算的示例代码
Nov 07 Python
python实现微信远程控制电脑
Feb 22 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
3分钟学会一个Python小技巧
Nov 23 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
Python3 如何开启自带http服务
May 18 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
第十二节--类的自动加载
2006/11/16 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
Laravel下生成验证码的类
2017/11/15 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
彻底理解js面向对象之继承
2018/02/04 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
Win8下python3.5.1安装教程
2020/07/29 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python可视化实现代码
2019/01/15 Python
详解python配置虚拟环境
2019/04/08 Python
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
基督教婚礼主持词
2014/03/14 职场文书
培训协议书范本
2014/04/22 职场文书
记账会计岗位职责
2014/06/16 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
地道战观后感
2015/06/04 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
在项目中使用redis做缓存的一些思路
2021/09/14 Redis