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

  • 定额税改为查账征收,可以弥补上年度亏损吗
  • 用友软件生成凭证合并进项税
  • 公司为员工报销的医药费
  • 核定征收可以不开免税普票吗
  • 公司名称变更期间可以投标吗
  • 个税补缴纳
  • 外债利息支付需要按照天计算吗?
  • 装载机折旧年限是几年
  • 当月发票作废需要收回么
  • 员工离职补偿需要计提吗
  • 资产负债表不平的原因有哪些
  • 发票加盖公章有用吗
  • 缴纳个人所得税扣除项目
  • 冲减成本怎么做会计分录
  • 股东投资款是否可以现金支付
  • 水产养殖公司的经营范围_问答
  • 补提以前年度个税会计分录
  • 税务需要申报吗
  • 喷绘广告公司税率是多少
  • 预缴税款多缴了怎么办
  • 文化事业建设费减免政策
  • 网络直播应如何缴纳增值税?
  • 外贸企业出口退税流程图
  • 支票结算方式下用其他货币资金账户
  • 购买债券发生的交易费用计入哪个科目
  • 企业的其他业务收入
  • 权益净利率计算公式推导
  • 医疗保险费扣除比例
  • 应收账款一般按实际发生额入账
  • 增值税小规模纳税人免征增值税政策
  • 借贷记账法的记账规则是
  • 个体工商户清算报告
  • 税金及附加包括个人所得税吗
  • reader_sl.exe - reader_sl进程有什么用.
  • uniapp使用高德地图创建多边形
  • 麦地那老城
  • 固定资产备抵科目怎么填
  • vue3配置文件
  • is-l命令
  • 财务报表怎样调出来
  • 股东出资证明书范本
  • 库存现金科目的辅助核算项目为日记账
  • 施工图审查费属于什么费用类别
  • vue 鼠标移入移出(hover)切换显示图片问题
  • 企业并购的主要特征是a扩大企业规模
  • 非营利组织会计就是用于确认、计量
  • 履约保证金能否委托支付
  • 微信交电费怎么交
  • sql中order by 1
  • 使用mysql命令
  • 小额贷款行业新规
  • 工程款可以转入存折里吗怎么转
  • 收据可不可以做账
  • 收不回来的其他应收账款如何处理?
  • 一个报表的格式主要包括( )
  • Mysql 5.7.17 winx64免安装版,win10环境下安装配置图文教程
  • Ubuntu配置永久IP配置文件
  • 重装系统 xp
  • ubuntu无法安装增强功能
  • members-area.exe是什么进程 members-area进程查询
  • win8系统网络设置在哪里
  • extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
  • Python win32com 操作Exce的l简单方法(必看)
  • js中函数定义有哪几种方式
  • shell 非
  • python 基础教程第三版 怎么样
  • javascript canvas方法有哪些
  • javascript基础笔记
  • JavaScript中void(0)的具体含义解释
  • python语言文件
  • javascript常用的类型包括
  • win7怎么装python3.8
  • 甘肃职称申报评审入口官网
  • 北京公积金缴纳最低基数
  • 为什么要征收城乡土地
  • 重庆电子税务局app下载
  • 税务申报作废后无法申报
  • 西安税务办税服务厅
  • 12366是哪里的税务局
  • 税收筹划与避税的性质相同
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设