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

  • 动态网页设计网站上线前,你得准备好“虚拟主机”、“域名”、“备案”三套

    动态网页设计网站上线前,你得准备好“虚拟主机”、“域名”、“备案”三套

  • 怎样让关键词排名更加稳定?(怎么让某个关键词排名上去)

    怎样让关键词排名更加稳定?(怎么让某个关键词排名上去)

  • 淘宝新手推广如何获取关注度(新手做淘宝怎么做推广)

    淘宝新手推广如何获取关注度(新手做淘宝怎么做推广)

  • 抖音看了直播忘了关注怎么找到(抖音看了直播忘记关麦)

    抖音看了直播忘了关注怎么找到(抖音看了直播忘记关麦)

  • 小红书怎么删除笔记(小红书怎么删除仓库中的商品)

    小红书怎么删除笔记(小红书怎么删除仓库中的商品)

  • 微信辅助是指什么(微信辅助是什么意思?会不会自己信息被泄露?)

    微信辅助是指什么(微信辅助是什么意思?会不会自己信息被泄露?)

  • 荣耀30是双扬声器吗(荣耀30单扬声器还是双扬声器)

    荣耀30是双扬声器吗(荣耀30单扬声器还是双扬声器)

  • 华为mate30pro有北斗导航吗(华为mate30pro支不支持北斗导航)

    华为mate30pro有北斗导航吗(华为mate30pro支不支持北斗导航)

  • 手机几分之几怎么输入

    手机几分之几怎么输入

  • 系统软件主要有(系统软件主要有哪些缩写)

    系统软件主要有(系统软件主要有哪些缩写)

  • 淘宝怎么打开菜鸟裹裹(淘宝怎么打开菜鸟身份码)

    淘宝怎么打开菜鸟裹裹(淘宝怎么打开菜鸟身份码)

  • 抖音的pid是什么(抖音店铺pid是什么意思)

    抖音的pid是什么(抖音店铺pid是什么意思)

  • 小米10自带的膜是什么膜(小米10自带的膜要撕掉吗)

    小米10自带的膜是什么膜(小米10自带的膜要撕掉吗)

  • 微信看不到对方的个性签名(微信看不到对方头像是不是被拉黑了)

    微信看不到对方的个性签名(微信看不到对方头像是不是被拉黑了)

  • 系统boot是什么意思啊(系统boot盘)

    系统boot是什么意思啊(系统boot盘)

  • 苹果8手机是否支持O T G(苹果8手机是否支持无线充电)

    苹果8手机是否支持O T G(苹果8手机是否支持无线充电)

  • wifi显示拒绝接入什么意思(wifi拒绝接入怎么弄)

    wifi显示拒绝接入什么意思(wifi拒绝接入怎么弄)

  • 爱剪辑怎么加同步字幕(爱剪辑怎么加同款音乐)

    爱剪辑怎么加同步字幕(爱剪辑怎么加同款音乐)

  • 蓝牙耳机音量小怎么调(华为手机蓝牙耳机音量小)

    蓝牙耳机音量小怎么调(华为手机蓝牙耳机音量小)

  • 小米6支持电信卡吗(小米支持电信volte的机型)

    小米6支持电信卡吗(小米支持电信volte的机型)

  • 快手双格视频怎么弄(快手怎么分两个格视频)

    快手双格视频怎么弄(快手怎么分两个格视频)

  • 苹果手机突然没网络是什么原因(苹果手机突然没声音了是什么原因)

    苹果手机突然没网络是什么原因(苹果手机突然没声音了是什么原因)

  • linux怎么关闭开关机音效?(linux关闭thp)

    linux怎么关闭开关机音效?(linux关闭thp)

  • NavMenu导航菜单el-submenu点击事件及激活状态变化(导航菜单是什么)

    NavMenu导航菜单el-submenu点击事件及激活状态变化(导航菜单是什么)

  • python偏函数如何理解(python偏函数理解)

    python偏函数如何理解(python偏函数理解)

  • 个税放在哪个科目核算
  • 费改税是哪一年
  • 应付职工薪酬应发数
  • 老板让我去分公司怎么拒绝
  • 货物退回是什么意思
  • 增值税专用发票可以开电子发票吗
  • 代收货款的商品
  • 物业管理水电费税率
  • 公交车收购
  • 实收资本变更股东要交税吗
  • 期末调汇的会计科目
  • 流动性比率小于3说明什么
  • 付垫资款给其他公司应该怎么做账?
  • 固定资产发票未到怎么提折旧
  • 增值税发票本月没用完可以下月用吗
  • 进项税转出的附加税怎么做
  • 个人独资企业需要公司章程吗
  • 高新技术企业研发费
  • 购进旅客运输服务抵扣会计分录
  • 水利建设专项收入税率
  • 运输公司购买机票怎么买
  • 已抵扣进项税额转出滞纳金
  • 出纳如何审核报销发票
  • 出租房产免收租金合法吗
  • 一直零申报会怎么样
  • mac如何连接2个airpods
  • 在win7系统中如何让电脑恢复出厂设置方法
  • php如何使用session
  • cn域名删除期
  • 鸿蒙系统怎么去掉负一屏
  • 移动临时文件
  • 三七粉的功效与作用及正确吃法
  • 蓝牙耳机连电脑
  • 收购后的固定资产如何入账
  • php实现原理
  • laravel5.4利用163邮箱发送邮件的步骤详解
  • 利用php判断是否为素数
  • 2022最新廉洁警示语句
  • 购买货物收到发票财务报表怎么提现
  • framework core
  • 简单的php文件
  • _get_osfhandle
  • 游戏公司不开票怎么缴税
  • db2 describe
  • 总公司下的分公司破产怎么赔偿
  • 代建制取费标准
  • 一般纳税人购买原材料会计分录
  • 实收资本有关会计科目
  • 认缴制不会带来的账务问题
  • 购入汽车当月需要计提折旧吗
  • 增加的实收资本印花税
  • 费用票成本票有哪些
  • 采购商品的运费会计分录
  • 收到一笔财政局的付款
  • 工程未完工,费用怎么处理
  • win8语言栏不见了 怎么调出来
  • 安装fedora33
  • gentoo linux优点
  • centos6.5mini安装教程
  • win10预览版退回正式版
  • WIN7系统怎么安装 注音输入法
  • 省去911元 教你如何将Win10家庭版改造成专业版
  • win7蓝屏怎么办
  • win8.1怎么用
  • win7玩英雄联盟卡顿怎么解决
  • unity serial number
  • jquery的实现原理
  • css中选择符
  • django orm sqlalchemy
  • js函数预解析
  • jquery width
  • Errors running builder 'Android Resource Manager' on Project java.lang.NullPointerException
  • javascript例题
  • jquery使用教程
  • unity类库
  • unity iphone
  • jquery js区别
  • Python调用大漠插件
  • python如何自动化
  • 游艇车船税怎么收
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设