位置: IT常识 - 正文

Python如何进行进程间的通信(python 如何)

编辑:rootadmin

推荐整理分享Python如何进行进程间的通信(python 如何),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python的步骤,python zen,Python如何进行进制转换,python进一,python的步骤,利用python进行,python怎么进阶,Python如何进行进制转换,内容如对您有帮助,希望把文章链接给更多的朋友!

进程间的通信-Queue

1. Queue的使用

可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:

#-*-coding:utf-8-*-frommultiprocessingimportQueue#创建一个Queue对象,最多可接受三条put消息q=Queue(3)q.put("消息1")q.put("消息2")print(q.full())q.put("消息3")print(q.full())try:q.put("消息4",True,2)except:print("消息队列已满,现有消息数量:%s"%q.qsize())try:q.put_nowait("消息5")except:print("消息队列已满,现有消息数量:%s"%q.qsize())#推荐方式,先判断消息队列是否已满,在写入ifnotq.full():q.put_nowait("消息6")#读取消息时,先判断消息队列是否为空,在读取ifnotq.empty():foriinrange(q.qsize()):print(q.get_nowait())

运行结果为:

FalseTrue消息队列已满,现有消息数量:3消息队列已满,现有消息数量:3消息1消息2消息3

说明

初始化Queue()对象时(例如:q=Queue()),若括号中没有指定可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);

Queue.qsize():返回当前队列包含的消息数量;

Queue.empty():如果队列为空,返回True,反之False ;

Queue.full():如果队列满了,返回True,反之False;

Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;

Python如何进行进程间的通信(python 如何)

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常;

2)如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常;

Queue.get_nowait():相当Queue.get(False);

Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True;

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常;

2)如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常;

Queue.put_nowait(item):相当Queue.put(item, False);

2. Queue实例

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

frommultiprocessingimportProcessfrommultiprocessingimportQueueimportosimporttimeimportrandom#写数据进程执行的代码defwrite(q):forvaluein["A","B","C"]:print("Put%stoQueue"%value)q.put(value)time.sleep(random.random())#读取数据进程的代码defread(q):whileTrue:ifnotq.empty():value=q.get(True)print("Get%sfromQueue"%value)time.sleep(random.random())else:breakif__name__=='__main__':#父进程创建Queue,并传递给各个子进程q=Queue()pw=Process(target=write,args=(q,))pr=Process(target=read,args=(q,))#启动子进程pw,写入pw.start()#等待pw结束pw.join()#启动子进程pr,读取pr.start()pr.join()print("所有数据都写入并且读完")

运行结果为:

PutAtoQueuePutBtoQueuePutCtoQueueGetAfromQueueGetBfromQueueGetCfromQueue

所有数据都写入并且读完。

3. 进程池中的Queue

如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

#coding=utf-8frommultiprocessingimportManagerfrommultiprocessingimportPoolimportosimporttimeimportrandomdefreader(q):print("reader启动(%d),父进程为(%d)"%(os.getpid(),os.getppid()))foriinrange(q.qsize()):print("reader从Queue获取到的消息时:%s"%q.get(True))defwriter(q):print("writer启动(%d),父进程为(%d)"%(os.getpid(),os.getppid()))foriin"Se7eN_HOU":q.put(i)if__name__=='__main__':print("-------(%d)Start-------"%os.getpid())#使用Manager中的Queue来初始化q=Manager().Queue()po=Pool()#使用阻塞模式创建进程,这样就不需要在reader中使用死循环了,可以让writer完全执行完成后,再用reader去读取po.apply(writer,(q,))po.apply(reader,(q,))po.close()po.join()print("-------(%d)End-------"%os.getpid())

运行结果为:

-------(880)Start-------writer启动(7744),父进程为(880)reader启动(7936),父进程为(880)reader从Queue获取到的消息时:Sreader从Queue获取到的消息时:ereader从Queue获取到的消息时:7reader从Queue获取到的消息时:ereader从Queue获取到的消息时:Nreader从Queue获取到的消息时:_reader从Queue获取到的消息时:Hreader从Queue获取到的消息时:Oreader从Queue获取到的消息时:U-------(880)End-------

相关推荐:

本文链接地址:https://www.jiuchutong.com/zhishi/303746.html 转载请保留说明!

上一篇:Spring Boot 学习笔记(spring boot怎么学)

下一篇:vue虚拟dom和diff算法(vue虚拟domdiff算法)

  • 2017移动营销何去何从?(移动营销指什么)

    2017移动营销何去何从?(移动营销指什么)

  • 荣耀30pro微信怎么分身(荣耀30pro微信怎么开美颜)

    荣耀30pro微信怎么分身(荣耀30pro微信怎么开美颜)

  • 华为荣耀8c手机屏幕多大(华为荣耀8C手机可以系统升级为5G吗?)

    华为荣耀8c手机屏幕多大(华为荣耀8C手机可以系统升级为5G吗?)

  • 荣耀9有红外线遥控吗(荣耀9红外线支持吗)

    荣耀9有红外线遥控吗(荣耀9红外线支持吗)

  • 小米小爱音响连不上网(小米小爱音响连接不上wifi)

    小米小爱音响连不上网(小米小爱音响连接不上wifi)

  • 抖音播放量为什么只有几十个(抖音播放量为什么会逐渐下降)

    抖音播放量为什么只有几十个(抖音播放量为什么会逐渐下降)

  • word画笔怎么用不了(word2019怎么使用画笔)

    word画笔怎么用不了(word2019怎么使用画笔)

  • 华为p40第一次充电充多久(华为p40第一次充电需要多长时间最好)

    华为p40第一次充电充多久(华为p40第一次充电需要多长时间最好)

  • iphone11屏幕有一条黑线		(iphone11屏幕有一条黑线)

    iphone11屏幕有一条黑线 (iphone11屏幕有一条黑线)

  • vivo手机视频没有声音是怎么回事(vivo手机视频没有声音如何恢复正常)

    vivo手机视频没有声音是怎么回事(vivo手机视频没有声音如何恢复正常)

  • 在抖音直播间怎样购物(在抖音直播间怎么买东西)

    在抖音直播间怎样购物(在抖音直播间怎么买东西)

  • 外置显卡有什么用(外置显卡有什么缺点)

    外置显卡有什么用(外置显卡有什么缺点)

  • hd在手机上是什么意思(手机上显示是什么意思)

    hd在手机上是什么意思(手机上显示是什么意思)

  • 苹果11没有闪光灯(苹果没有闪光点)

    苹果11没有闪光灯(苹果没有闪光点)

  • 摩拜怎么看超出范围(摩拜单车怎么看骑行路线)

    摩拜怎么看超出范围(摩拜单车怎么看骑行路线)

  • 怎么把手机软件传到电脑上(怎么把手机软件转到另一个手机)

    怎么把手机软件传到电脑上(怎么把手机软件转到另一个手机)

  • 抖音怎么去掉前边省份(抖音怎么去掉前面视频)

    抖音怎么去掉前边省份(抖音怎么去掉前面视频)

  • 苹果xr双卡双待吗(苹果xr双卡双待怎么用)

    苹果xr双卡双待吗(苹果xr双卡双待怎么用)

  • 飞猪10岁儿童票怎么买(飞猪旅行儿童票怎么买的)

    飞猪10岁儿童票怎么买(飞猪旅行儿童票怎么买的)

  • 栈的定义是什么(栈的定义是什么并说明数据如何进出)

    栈的定义是什么(栈的定义是什么并说明数据如何进出)

  • 【Java编程指南】方法(java编程入门基础教程)

    【Java编程指南】方法(java编程入门基础教程)

  • tty命令  打印输出连接到标准输入的终端文件名(python打印type)

    tty命令 打印输出连接到标准输入的终端文件名(python打印type)

  • python索引的顺序和倒序(python 索引-1)

    python索引的顺序和倒序(python 索引-1)

  • 增值税专用发票几个点
  • 房地产税收有哪些
  • 缴纳印花税的会计凭证
  • 个体户注销工商没有收走公章
  • 控股子公司增资扩股
  • 贷款利息怎么算的
  • 在银行购买支票需要什么手续
  • 货已到发票未到跨年怎么做账
  • 2021留美学生签证
  • 股权转让企业所得税纳税地点
  • 专利权转让的净收益计入
  • 划拨土地能转为商业用地吗
  • 专项资金怎么入账
  • 购买理财产品是不是非法集资
  • 装修期间用电
  • 企业核定征收的好处
  • 技术服务税票
  • 维修属于劳务还是劳务
  • 无形资产软件摊销年限的最新规定2021
  • 收到支票怎么处理
  • 购买汽车可以开普通发票吗
  • 在win7系统中如何让电脑恢复出厂设置方法
  • 在建工程进项税可以抵扣吗
  • Win10任务栏没有wifi图标
  • 小规模年底税金怎么做账
  • php获取路径和目录的方法
  • 跨区域预缴增值税是当月还是次月
  • 国内旅客运输服务发票
  • php截取字符串几种方式
  • 超市账目月底怎么核算
  • css浮动怎么弄
  • 合伙企业分红怎么做账
  • 银行存款利息收税吗
  • 一般人转小规模政策文号
  • 最常用的成本核算表格
  • 公对公二手车交易税
  • php和mysql的联合使用解决了
  • 织梦模板安装详细教程
  • 织梦怎么导入数据库
  • 建安企业确认收入的依据
  • 公司银行开户的经办人有无风险
  • 收到红字发票如何入账
  • 出租车发票上没有税务局的印章能报销么
  • 建筑公司是可以开在住宅小区吗
  • sql server2005怎么打开
  • 企业间借款利息收入
  • 核定征收和查账征收可以自己选择吗
  • 出口货物关税完税价格包括哪些
  • 本月销售商品会计分录
  • 钢管租赁怎么算的
  • 月末应交增值税借方余额期末该怎么处理
  • 代缴社保的好处有哪些
  • 滞纳金的上限是多少
  • 跨年度利息收入如何调整
  • 工程款外地预缴哪些税
  • 新会计准则关于贷款损失准备
  • 付给非公司员工提成税务处理
  • sql中where语句的写法
  • 史上最简单的皮筋枪
  • xampp修改mysql默认密码的方法
  • linux 详解
  • mac睡眠设置方法
  • 盘点十大最流行歌曲
  • windows休眠文件
  • 优化了一些已知问题是什么意思安不安装
  • XMLHttpRequest Level 2 使用指南
  • jquery排序上升和排序下降
  • js settimeout用法
  • fastcgi iis
  • 传智播客javappt
  • unity3d shader之Julia集和Mandelbrot集绘制美丽图案 (二)
  • JavaScript中的this指向
  • Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
  • python安装基础教程
  • python安装包的命令
  • 北京户籍网官方网站
  • 电子税务局怎么添加银行账户信息
  • 退契税可以不用本人银行卡吗
  • 增值税发票勾选是什么意思
  • 广东省国家税务总局稽查局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设