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

  • 进项税额转出补交税款
  • 一般纳税人结转税额怎么做会计分录
  • 一般计税预缴增值税3%怎么办
  • 预缴增值税如何计提
  • 小微企业城建税优惠政策2022
  • 估算成本的会计要素
  • 购买房产怎么确认收入
  • 股权转让评估费可以有公司承担吗
  • 企业用现金购进存货是单选题
  • 由财政拨钱还银行借款怎么做分录?
  • 已认证未抵扣进项税如何做账
  • 建筑业企业所得税2%
  • 红字发票怎么做帐
  • 企业自行建造的固定资产
  • 收到注册资金要交税吗
  • 抽奖获得的奖品有权转卖吗
  • 建筑行业挂靠什么意思
  • 收到利息收入会计分录怎么写
  • 毛利率与净利率的差额
  • 行政事业单位职工体检依据
  • PHP:xml_get_current_byte_index()的用法_XML解析器函数
  • 打印机5b00错误解决
  • php add
  • 增值税进项发票不够抵扣怎么办
  • 对公账户收款
  • 在anaconda下安装python
  • framework core
  • Thinkphp事务操作实例(推荐)
  • 原材料计入什么凭证
  • java web购物系统
  • 怎么把vue项目跑起来
  • 哪些发票是成品发票
  • 第十四届中国大学生数学竞赛
  • 什么叫相机标定
  • 《推荐一个好地方》图书馆
  • 为什么没缴税
  • 工资可以当月计提当月发放怎么做账
  • 新申报是什么
  • mysql 测试
  • python 熵值法
  • 冲以前年度管理费用
  • 加油充值预付卡怎么做账
  • 递延收益与预收收益区别
  • 附加税扣款时做成了借税金及附加怎么办
  • 企业工会经费计提标准
  • 企业内部研发支持方案
  • sql优化的方法及思路
  • 增值税扣缴义务发生时间为扣缴义务人扣缴税款的当天
  • 滴滴电子普通发票能抵扣进项税吗
  • 费用暂估入账后期如何冲销
  • 会员卡收费
  • 运输费用如何做账
  • 境外企业向境内企业提供技术服务
  • 押金是否可以抵扣租金
  • 厂家给的返利应该怎么做会计分录
  • 银行手续费在现金流量表怎么填
  • 银行开手续费发票怎么做账
  • 费用报销单和支付证明单的区别
  • 广告赞助的形式
  • 发票税率如何填写
  • mysql 5.7.12 winx64安装配置方法图文教程
  • sqlserver删除数据语句
  • mysql 大数据处理
  • 安装win8系统需要什么条件
  • Win10 Mobile Build 10549正式推送:须回滚到WP8.1升级
  • gnaupdaemon.exe是什么
  • win7系统任务栏跑到右侧怎么办
  • /proc目录造成linux根目录爆满
  • ExtJs 3.1 XmlTreeLoader Example Error
  • 高级控件动态数据加载过程有哪些
  • js frameset
  • js多选
  • javascript的相关应用
  • javascript题
  • js截取数组方法
  • js 队列
  • 置顶快手作品怎么弄
  • 增值税进项税额抵扣凭证
  • 福建省茶叶协会会长名单
  • 广州代理记账公司地址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设