期刊介绍
电信网技术刊物。旨在贯穿政府颁布的电信网技术体制、标准、规范、提供与新技术、新装备有关的各种网络规划的解决方案,以及系统、终端设备入网检测信息、咨询,增进中外电信界的相互了解,促进电信主管、经营、科研...【详细查看】
期刊导读
- 08/18我国信息通信领域实力最强的六所高校,两所非
- 08/17python笔记44:进程间通信机制-消息队列
- 08/17全球十大通信公司,移动只能排第二
- 08/17深圳市新一代信息通信产业集群展及院士论坛今
- 08/17各种无线通信技术在车联网中有什么应用
python笔记44:进程间通信机制-消息队列
【作 者】:网站采编
【关键词】:
【摘 要】:主要内容: 小目标:掌握进程间通信方式 主要内容:消息队列 一个问题:父子进程之间变量不共享,他们之间如何进行通信? 1. 消息队列 消息队列相关方法 消息队列是进程间通信的
主要内容:
- 小目标:掌握进程间通信方式
- 主要内容:消息队列
一个问题:父子进程之间变量不共享,他们之间如何进行通信?
1. 消息队列
消息队列相关方法 消息队列是进程间通信的一张方式,它基于系统提供的机制实现;
使用方式:from multiprocessing import Queue
方法说明:
消息队列
注意:消息入队与出队默认阻塞模式,可以设置超时或者非阻塞模式;
消息队列为空,queue.get()一直阻塞,直到有消息入队消息;
队列为满,queue.put()一直阻塞,知道消息队列不满;
2. 一个例子:
需求:
父进程读取键盘输入,并通过消息队列传给子进程, 输入'q'退出;
子进程读取消息队列,将信息打印,收到'q'退出;
代码实现:
import multiprocessingfrom multiprocessing import Queue#进程函数def func(msgq): while True: msg = msgq.get() if msg == 'q': break print(\"sub process receive msg:\", msg)if __name__ == \"__main__\": #全局消息队列 main_msgq = Queue() #消息队列必须通过参数传入到子进程,否则无效 p = (target=func, args=(main_msgq,)) p.start() while True: #读取输入 val = input('input :') #插入消息 main_msgq.put(val) if val == 'q': break p.join()
结果:
input :1input :sub process receive msg: 12sub process receive msg: 2input :3sub process receive msg: 3input :q
注意点:消息队列必须通过参数传递给子进程,否则不生效;
3. 阻塞与非阻塞方式:
3.1 设置阻塞模式
- 例1:消息入队
#消息队列数量为2msgq = Queue(maxsize=2)#放入两条消息msgq.put('1')msgq.put('2')#判断fullprint(())#插入一条,一直阻塞msgq.put('3')print(\"end\")
结果:一直阻塞,直到队列有空位置;
- 例2: 消息出队
msgq = Queue(maxsize=2)print(())msgq.get()print('over')
结果:一直阻塞,直到有消息;
3.2 设置超时
例3:消息入队设置超时
#消息队列数量为2msgq = Queue(maxsize=2)#放入两条消息msgq.put('1')msgq.put('2')#判断fullprint(())#插入一条,一直阻塞msgq.put('3', timeout=1)print(\"ove\")
结果:超时异常;
对应读取消息:msgq.get(timeout=1)
3.3 设置非阻塞模式
#消息队列数量为2msgq = Queue(maxsize=2)#放入两条消息msgq.put('1')msgq.put('2')#判断fullprint(())msgq.put('3', block=False)print(\"ove\")
结果:消息队列full之后,直接写入消息,报异常;
总结:
消息队列使用,一定要注意使用场景;
使用消息队列可以实现生产者与消费者模型;
理解:阻塞模式,超时模式,非阻塞模式;
文章来源:《信息通信技术与政策》 网址: http://www.xxtxzz.cn/zonghexinwen/2020/0817/603.html