网络编程
位置:首页>> 网络编程>> Python编程>> Python进程间通信Queue实例解析

Python进程间通信Queue实例解析

作者:王辉_Python  发布时间:2023-11-06 13:50:08 

标签:python,进程,queue

本文研究的主要是Python进程间通信Queue的相关实例,具体如下。

1.Queue使用方法:

  • Queue.qsize():返回当前队列包含的消息数量;

  • Queue.empty():如果队列为空,返回True,反之False ;

  • Queue.full():如果队列满了,返回True,反之False;

  • Queue.get():获取队列中的一条消息,然后将其从列队中移除,可传参超时时长。

  • Queue.get_nowait():相当Queue.get(False),取不到值时触发异常:Empty;

  • Queue.put():将一个值添加进数列,可传参超时时长。

  • Queue.put_nowait():相当于Queue.get(False),当队列满了时报错:Full。

2.Queue使用实例:

来,上代码:


#!/usr/bin/env python3

import time
from multiprocessing import Process,Queue

q = Queue() #创建列队,不传数字表示列队不限数量
for i in range(11):
 q.put(i)

def A():
 while 1:
   try:
     num = q.get_nowait()
     print('我是进程A,取出数字:%d'%num)
     time.sleep(1)
   except :
     break

def B():
 while 1:
   try:
     num = q.get_nowait()
     print('我是进程B,取出数字:%d'%num)
     time.sleep(1)
   except :
     break

p1 = Process(target = A)
p2 = Process(target = B)
p1.start()
p2.start()

此程序是在队列中加入10个数字,然后用2个进程来取出。

运行结果:

我是进程A,取出数字:0
我是进程B,取出数字:1
我是进程A,取出数字:2
我是进程B,取出数字:3
我是进程A,取出数字:4
我是进程B,取出数字:5
我是进程B,取出数字:6
我是进程A,取出数字:7
我是进程B,取出数字:8
我是进程A,取出数字:9
我是进程B,取出数字:10

3.使用进程池Pool时,Queue会出错,需要使用Manager.Queue:

上代码


#!/usr/bin/env python3

import time
from multiprocessing import Pool,Manager,Queue

q = Manager().Queue()
for i in range(11):
 q.put(i)

def A(i):
 num = q.get_nowait()
 print('我是进程%d,取出数字:%d'%(i,num))
 time.sleep(1)

pool = Pool(3)

for i in range(10):
 pool.apply_async(A,(i,))

pool.close()
pool.join()

运行结果:

我是进程1,取出数字:0
我是进程0,取出数字:1
我是进程2,取出数字:2
我是进程4,取出数字:3
我是进程3,取出数字:4
我是进程5,取出数字:5
我是进程6,取出数字:6
我是进程7,取出数字:7
我是进程8,取出数字:8
我是进程9,取出数字:9

当把Manager().Queue()直接换成Queue(),可能会出现资源混乱,缺少进程。

4.主进程定义了一个Queue类型的变量,并作为Process的args参数传给子进程processA和processB,两个进程一个向队列中写数据,一个读数据。


import time
from multiprocessing import Process,Queue

MSG_QUEUE = Queue(5)

def startA(msgQueue):
 while True:
   if msgQueue.empty() > 0:
     print 'queue is empty %d' % (msgQueue.qsize())
   else:
     msg = msgQueue.get()
     print 'get msg %s' % (msg,)
   time.sleep(1)

def startB(msgQueue):
 while True:
   msgQueue.put('hello world')
   print 'put hello world queue size is %d' % (msgQueue.qsize(),)
   time.sleep(3)

if __name__ == '__main__':
 processA = Process(target=startA,args=(MSG_QUEUE,))
 processB = Process(target=startB,args=(MSG_QUEUE,))

processA.start()
 print 'processA start..'

processB.start()
 print 'processB start..'

其打印的结果如下:

C:\Python27\python.exe E:/outofmemory/test/queuetest/queuetest.py
processA start..
processB start..
queue is empty 0
put hello world queue size is 1
get msg hello world
queue is empty 0
queue is empty 0
put hello world queue size is 1
get msg hello world
queue is empty 0
queue is empty 0
put hello world queue size is 1

来源:https://www.cnblogs.com/PrettyTom/p/6583153.html

0
投稿

猜你喜欢

  • 八皇后问题描述问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四
  • 触发器权限和所有权CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色成员以及 db_owner
  • 程序图标主要作用是为了使该程序更加具象及更容易理解,除了上述的作用外,有更好视觉效果的图标可以提高产品的整体体验和品牌,可引起用户的关注和下
  • 功能是:以一个关键字为索引,搜索整个数据库,然后返回那个关键字所在的表名和列名。(很赞...特别是入侵的时候找不到用户名与密码所在的表的时候
  • 正在看的ORACLE教程是:Oracle 数据表分区的策略。本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括
  • 1。onabort(ns3,ns4,ie4):当用户终止正在打开的网页时产生该事件。2。onblur(ns3,ns4,ie3,ie4):某元
  • 当你需要一个简单易用的导航菜单得时候。CSS Menu是个不错的选择。相对于Flash/Javascript,他们小巧轻便,而且方便使用。当
  • 本文实例讲述了php使用pthreads v3多线程实现抓取新浪新闻信息。分享给大家供大家参考,具体如下:我们使用pthreads,来写一个
  • 1、Dreamweaver中的复制我在网页中复制的文字,粘贴到Dreamweaver中时,它总是带有原来网页的格式,请问如何只复制其中的文本
  • 在所有信息技术领域,网页设计、网站设计长期是个几乎搞不清楚的、弱势的、被边缘化的职能职位。但近些年发展中,不断有远见卓识的从业者认识到,“设
  • 我的原数据库是3.23版本的.前几天因为一个论坛转移.必须用5.1的.于是就是升级了数据库.论坛是正常的.可以是原来的一个老库因为是3.23
  • 一、在访客的内心深处做导航我讨厌迷失,不管是在道路上或是在线网络上。猜想一下?您的访客也是这样的。就像我们期望看到的道路上的路标一样,来帮助
  • 集群是一种技术解决方案,它将硬件和软件结合起来,为Web、Email以及数据库等服务提供高可用性和高伸缩性的架构。本文将分析集群的类型,然后
  • sql server的备份与恢复(查询分析器) 查询分析器: 命令: 1:备份数据库命令: backup database whdb1(要备
  • 看到了很多关于如何读出图片的长度的高度的方法,其实都不实用,大多都是通过图片的大小来判断的,图片的种类众多,通过大小来判断难免要制造很多的代
  • 直接分析,如原矩阵如下(1):  (1) 我们要截取的矩阵(取其一三行,和三四列数据构成矩阵)为如下(2):  (2)错
  • eWebEditor在线HTML编辑助手是基于eWebEditor在线HTML编辑器的扩展工具。当您的电脑安装了eWebEditor在线HT
  • 作者:AngelGavin  出处:CSDNInternet Explorer 5.0 对 XML 提供哪个级别的支持?Inter
  • PDOStatement::fetchAllPDOStatement::fetchAll — 返回一个包含结果集中所有行的数组(PHP 5
  • 本文实例讲述了PHP中PDO事务处理操作。分享给大家供大家参考,具体如下:概要:将多条sql操作(增删改)作为一个操作单元,要么都成功,要么
手机版 网络编程 asp之家 www.aspxhome.com