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

  • 另类式营销—沉浸式营销,不可言说的感觉(另类促销)

    另类式营销—沉浸式营销,不可言说的感觉(另类促销)

  • 苹果13色彩滤镜在哪里(苹果14色彩滤镜怎么调)

    苹果13色彩滤镜在哪里(苹果14色彩滤镜怎么调)

  • 苹果xr几个卡槽(苹果xr几个卡槽的区别)

    苹果xr几个卡槽(苹果xr几个卡槽的区别)

  • ios无法下载app请重试(iphone提示无法下载应用)

    ios无法下载app请重试(iphone提示无法下载应用)

  • 华为mate30怎么分屏操作(华为mate30与mate30pro的区别)

    华为mate30怎么分屏操作(华为mate30与mate30pro的区别)

  • 联想笔记本截图功能(联想笔记本截图保存在哪里了?)

    联想笔记本截图功能(联想笔记本截图保存在哪里了?)

  • 微信付款码可以截图发给别人付款吗(微信付款码可以找到本人吗)

    微信付款码可以截图发给别人付款吗(微信付款码可以找到本人吗)

  • vivocamera&music是什么型号(vivocamera&music是什么手机)

    vivocamera&music是什么型号(vivocamera&music是什么手机)

  • pc平板二合一是什么意思(pc平板二合一是电脑吗)

    pc平板二合一是什么意思(pc平板二合一是电脑吗)

  • 微信怎么删除好友(微信怎么删除好友快捷方式)

    微信怎么删除好友(微信怎么删除好友快捷方式)

  • 苹果11怎么拒绝来电(苹果11怎么拒绝垃圾信息和电话)

    苹果11怎么拒绝来电(苹果11怎么拒绝垃圾信息和电话)

  • 微信头像上的圣诞帽怎么弄(微信头像的圣诞帽怎么取消)

    微信头像上的圣诞帽怎么弄(微信头像的圣诞帽怎么取消)

  • 嘿siri能改别的吗(嘿siri可以更改吗)

    嘿siri能改别的吗(嘿siri可以更改吗)

  • 8分钟的视频怎么发微信(8分钟的视频怎么发给qq好友)

    8分钟的视频怎么发微信(8分钟的视频怎么发给qq好友)

  • Reno Ace怎么查看手机序列号(oppo reno ace怎么查激活日期)

    Reno Ace怎么查看手机序列号(oppo reno ace怎么查激活日期)

  • 淘宝抢购提醒怎么取消(淘宝设置的抢购提醒在哪关掉)

    淘宝抢购提醒怎么取消(淘宝设置的抢购提醒在哪关掉)

  • ppt演示文稿怎么做(PPT演示文稿怎么设置)

    ppt演示文稿怎么做(PPT演示文稿怎么设置)

  • 华为手机照片怎么导出(华为手机照片怎么拼图合成一张)

    华为手机照片怎么导出(华为手机照片怎么拼图合成一张)

  • 小米手机有扫描功能吗(小米手机有扫描身份证的功能吗)

    小米手机有扫描功能吗(小米手机有扫描身份证的功能吗)

  • 网站只让看10分钟视频怎么办(网页就可以看的网站)

    网站只让看10分钟视频怎么办(网页就可以看的网站)

  • 抖音海外版怎么下(抖音海外版怎么没网络)

    抖音海外版怎么下(抖音海外版怎么没网络)

  • 小米cc9可以无线充电吗(小米cc9能不能无线充电)

    小米cc9可以无线充电吗(小米cc9能不能无线充电)

  • iphonex屏幕乱跳(iphonex手机屏幕乱跳彻底解决办法)

    iphonex屏幕乱跳(iphonex手机屏幕乱跳彻底解决办法)

  • 系统重装重新启动后出现oem7grub 0.4.4 20091118(电脑重装系统启动)

    系统重装重新启动后出现oem7grub 0.4.4 20091118(电脑重装系统启动)

  • win10远程连接切换用户重复输入登录密码解决教程(win10 打开远程连接)

    win10远程连接切换用户重复输入登录密码解决教程(win10 打开远程连接)

  • Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web

    Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web

  • 帝国cms列表页怎么改分页导航样式样式(帝国cms栏目分类)

    帝国cms列表页怎么改分页导航样式样式(帝国cms栏目分类)

  • 董事会职权是否为强制规定
  • 个人所得税定期定额起征点
  • 百旺税盘网络连接不上
  • 付款单位与开票单位不一致如何做账?
  • 个人转让房产涉税政策
  • 住宿发票抵扣怎么做账
  • 建筑业确认主营业务收入
  • 发票丢失可以冲销吗
  • 借差旅费退回现金怎么办
  • 股东贷款企业贷债务
  • 增值税普通发票几个点
  • 商贸公司进项税额大
  • 华为nova10pro支持多少倍变焦
  • 税负率的计算方法公式
  • 其他流动负债有利息吗
  • 全部投资内部收益率
  • mac dock不见了
  • macbook显示隐藏文件
  • frontpage在哪里打开
  • AUTOMATIC1111/stable-diffusion-webui安装教程
  • 房产置换流程及费用
  • Chat GPT实用案例——VUE+Chat GPT实现聊天功能教程
  • yii框架文档
  • 不动产和无形资产的区别
  • vue项目部署到服务器上,页面空白
  • 常用的成本计算方法有哪些
  • 投资收益如何做账务处理
  • html渐变色背景
  • win11 退回
  • timedatectl命令用法
  • javascriptjs
  • 一个合同里面服务怎么写
  • 员工意外伤害保险最多赔多少
  • 注解@entity
  • 附加税多计提了怎么调整
  • 公司性质不一样的重名可以吗
  • 更正申报失败,维持原申报?
  • mysql时间格式转换函数
  • 财务报表审计的基础是独立性和专业性
  • 什么是国家限制企业或行业
  • 可供出售金融资产的会计处理
  • 个人去税务局开劳务发票要交多少税
  • 纯加工企业账务处理
  • 本月增值税申报截止日
  • 零税率发票有法律效力吗
  • 建筑企业收到发票未付款怎么做账
  • 电子设备折旧残值率
  • 员工报销工伤险怎么报销
  • 当月没开发票
  • 电子承兑汇票是24小时签收吗
  • 固定资产 金额
  • 工程款项目的发包人是谁
  • 个人贷款打到公司账户存在什么风险
  • 银行存款利息收入要交增值税吗
  • 发票限额如何限定
  • 增值税进项发票抵扣认证流程
  • 房地产开发企业资质管理规定
  • 收派服务费可以简易计税吗
  • 购入旧的固定资产还能一次性抵扣吗
  • 股东退股如何清算表格
  • 如何把数据导入mysql中
  • delete from 表名 where
  • mysql数据库基础与实践课后答案
  • win2003远程桌面最大连接数
  • coms恢复出厂设定还原bios设置方法步骤讲解
  • windows10正式版
  • 新买的u盘安全吗
  • centos配ip的方法
  • centos7.6有线连接
  • linux中su切换用户不成功
  • 开发者学校
  • 欢迎使用来电提醒业务是什么意思
  • android 像素
  • Emeditor与dos(cmd)经典使用技巧之批量生成网页
  • Android studio DrawerLayout
  • unity uGUI按钮点击换图
  • android如何防止js注入
  • jquery 3.5
  • 生鲜肉类免税
  • 佛山电动摩托车能上牌吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设