您的位置:首页 > 编程语言 > Python开发

Python进程间通信--Queue

2018-03-30 13:11 176 查看
#进程间通信--Queue--操作系统开启消息队列
'''Process有时是需要通信的,操作系统提供了很多机制来实现进程间通信
而Queue就是其中一个
1、Queue的使用问题,可以使用multiprocessing模块下的Queue实现多进程直接的传递,Queue本身就是
一个消息队列,首先
'''

#但是MAC的qsize  用不了。。,所以本篇代码会报错NotImplementedError,属于正常

from multiprocessing import Queue

if __name__=='__main__':
#初始化一个Queue对象,最多可以接收3条信息
# Queue类的__init__方法中def __init__(self, maxsize=-1):#-1表示无穷大
#实战代码就是-1或者不写,就是无穷大
# q=Queue(3)#开辟了空间
#
# #向里面放消息,一个进程可以放多条消息到Queue中
# #放消息
# q.put('消息1')
# q.put('消息2')
# print(q.full())
# q.put('消息3')
# print(q.full())
# q.full()#满为真True,未满:False
#  if q.full():
#      print('消息队列已经满了,不要再放了')
#  else:
#      q.put('消息N')

#若队列满了,我还接着put,会发生什么
#q.put('消息4')#等同于q.put('消息4',True,None)
#def put(self, obj, block=True, timeout=None):
#会发生阻塞,等待,直到消息队列不满时添加进去
#print(q.full())
# q.put('消息4',False)#因为之前已经放满了,所以执行本语句会报错queue.Full

#下面的try...except不够健壮,会阻塞一直等待下去
# try:
#     q.put('消息4')
# except:
#     print('消息队列已经满了,现在消息数量:%d'%q.qsize())

#实战中以下会更健壮
# if not q.full():
#     q.put('消息内容',False)#False意为不等,立即向里面放
#以上两句等同于Queue中put_nowait方法
# if not q.full():
#     q.put_nowait('消息内容')

#获取信息 先进先出原则FIFO
q1=Queue(3)
q1.put('A')
q1.put('B')
q1.put('c')
count=q1.qsize()#线程池数量为全局变量
if not q1.empty():
for i in range(count):
# get(self, block=True, timeout=None): get(self, block=True, timeout=None):
#print(q1.get())#取出线程池所有消息后,会一直等待,不能结束,发生阻塞
print('%d'%q1.qsize())
print(q1.get_nowait())

print('over!')
'''
说明:
1、初始化Queue对象时,例如:q=Queue(),或括号中没有指定最大可接收的消息数量,
或数量为负值,那么就表示可接收的消息数量没有上限(直到内存的尽头)

2、常用函数
a.   q.qsize()返回当前队列包含的消息数量
b.   q.full()表示当前队列是否已经满了,True-满,False-未满
c.   q.put('消息',block=True,timeout=None)
q.get(block=True,timeout=None)
block(默认True)----此时阻塞,等待,直到put/get进去为止
timeout(默认None)--一直等待,如果设置timeout,等待N秒后会强制put/get
d.  q.put_nowait()--相当于q.put('消息内容',False)
e.  q.empty()表示当前队列是否为空,True空,False不空
f.  q.get_nowait()--相当于q.get(block=False)
'''
ABCover
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: