位置: 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算法)

  • 全国住房公积金小程序在哪里打开(全国住房公积金怎么提取)

    全国住房公积金小程序在哪里打开(全国住房公积金怎么提取)

  • 微信群视频可以切换播放ppt吗(微信群视频可以共享屏幕吗)

    微信群视频可以切换播放ppt吗(微信群视频可以共享屏幕吗)

  • 华为平板丢了怎么定位找回(华为平板丢了怎么用手机定位找回)

    华为平板丢了怎么定位找回(华为平板丢了怎么用手机定位找回)

  • 充电口进水了对手机有什么影响(充电口进水会导致充电变慢吗)

    充电口进水了对手机有什么影响(充电口进水会导致充电变慢吗)

  • 桌面一直在闪无法运行(桌面一直在闪烁)

    桌面一直在闪无法运行(桌面一直在闪烁)

  • 平板可以用word吗(平板可以用word和ttp)

    平板可以用word吗(平板可以用word和ttp)

  • 群公告删除后别人能看到吗(群公告删了谁会看到)

    群公告删除后别人能看到吗(群公告删了谁会看到)

  • 苹果的电话技术支持是什么(苹果的电话技术支持服务)

    苹果的电话技术支持是什么(苹果的电话技术支持服务)

  • 快手怎么看别人的动态和赞(快手怎么看别人给我发的消息)

    快手怎么看别人的动态和赞(快手怎么看别人给我发的消息)

  • 好友恢复成了单向好友(好友恢复成了单子怎么办)

    好友恢复成了单向好友(好友恢复成了单子怎么办)

  • 微信视频号和朋友圈小视频的区别(微信视频号和朋友圈是一起的吗)

    微信视频号和朋友圈小视频的区别(微信视频号和朋友圈是一起的吗)

  • 手机被别人举报停机怎么办(手机被别人举报怎么办)

    手机被别人举报停机怎么办(手机被别人举报怎么办)

  • 把一个人拉黑了对方知道吗(把一个人拉黑了他还能加我吗)

    把一个人拉黑了对方知道吗(把一个人拉黑了他还能加我吗)

  • volte高清通话有必要开启吗(iqoo高清通话volte怎么设置)

    volte高清通话有必要开启吗(iqoo高清通话volte怎么设置)

  • 微信更新一直显示等待中(微信更新一直显示打开页面)

    微信更新一直显示等待中(微信更新一直显示打开页面)

  • 苹果xsmax关闭刘海(苹果xsmax关闭刘海屏)

    苹果xsmax关闭刘海(苹果xsmax关闭刘海屏)

  • 华为手机找不到返回键(华为手机找不到应用图标)

    华为手机找不到返回键(华为手机找不到应用图标)

  • 密友值是什么(密友值是啥)

    密友值是什么(密友值是啥)

  • 荣耀20pro支持红外遥控吗(荣耀20pro支持红外线遥控吗)

    荣耀20pro支持红外遥控吗(荣耀20pro支持红外线遥控吗)

  • 怎样恢复ie为默认浏览器(怎样恢复ie为默认浏览器win10)

    怎样恢复ie为默认浏览器(怎样恢复ie为默认浏览器win10)

  • v1730dt是什么型号(v17321是什么型号)

    v1730dt是什么型号(v17321是什么型号)

  • 小米6有语音唤醒功能吗(小米6支持语音)

    小米6有语音唤醒功能吗(小米6支持语音)

  • vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等(vue实现导出)

    vue导出含有多个表的excel,并设置边框、背景色、字体、宽度等(vue实现导出)

  • devtools安装(devtools安装mac)

    devtools安装(devtools安装mac)

  • JS原生读取 本地 JSON(原生js获取document)

    JS原生读取 本地 JSON(原生js获取document)

  • 工资表个税多扣了账务处理递减
  • 股票权类型
  • 代扣个税的会计分录怎么做
  • 资金账簿印花税每年都要交吗?
  • 金税四期什么时候正式上线
  • 开矿泉水发票怎么开?
  • 银行承兑汇票是什么科目
  • 企业所有者权益科目有哪些
  • 小规模纳税人变成一般纳税人之前的发票变更
  • 国际多式联运必须具备的基本条件是什么
  • 公司注销后专利还能转让吗
  • 装修保证金怎么记账
  • 进料加工企业的增值税如何处理
  • 应交税费是什么科目借贷方向
  • 增值税专用发票可以开电子发票吗
  • 三证合一后章要换吗
  • 什么时候计入其他综合收益什么时候计入投资收益
  • 开票系统维护费可以全额抵扣吗
  • 事业单位开发成本占比
  • 金税盘减免政策依据
  • 劳务报酬所得缴多少税
  • 进项税和销项税怎么理解
  • 公司股权转让流程是先工商还是税务
  • 主营业务收入平均增长率计算例题
  • 坏账是什么意思
  • 王者荣耀花木兰打法教学
  • 怎么安装Win7系统
  • 桌面图标间距特别大
  • 房地产企业增值税怎么计算
  • 进项发票抵扣途中怎么办
  • element-ui表格
  • thinkphp分表
  • 不想预缴所得税能不能提前暂估费用,会计分录
  • 数字图像处理课后题答案
  • 园林绿化工程公司排名
  • 航空公司开具的代订机票费可以抵扣吗
  • 免税收入和不征税收入有何区别
  • 我有朋友吗朋友圈说说
  • sql server2012新建一个数据表
  • 税前利润是否等于利润总额
  • 预收一年房租的会计科目
  • 一般纳税人开普票和专票有什么区别
  • 普通发票忘记开数量和单价可以用吗?
  • 内账应收应付怎么对账
  • 借款合同相关法条
  • 一般纳税人购进商品的会计分录
  • 发票限额如何限定
  • 小规模开专票的税点是多少
  • 电子银行承兑汇票能拆票吗
  • 工会经费计提比例是2%还是0.8%
  • 事业单位收到钱怎么记账
  • 无形资产的摊销方法
  • mysql在指定字段前添加
  • sql server怎么向表里添加数据
  • linux中yum的使用
  • 腾讯云 阿里云 营收对比
  • win8管理工具在哪里
  • 进程acore已停止一直出现怎么办
  • winxp系统和win7系统有什么区别
  • centos安装vim命令
  • win7系统安装虚拟机
  • linux中ctrl+c
  • win7系统声音设置方法
  • 双系统其中一个系统无法开机
  • win8的ie浏览器
  • 装了linux后windows没有了
  • 跑酷游戏cs
  • nodejs和mysql
  • css中注释的写法
  • 批处理文件是将需要连续使用的可多次重复使用的
  • 批处理 修改文件名
  • vscode 远程调试jni
  • jquery移动版
  • 新浪微博模仿推特
  • 友盟模块
  • python获取xhr
  • js怎么设置图片大小
  • jquery的哪个方法可以绑定mouseover
  • jqueryapi手机版
  • 贵阳税务局领导
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设