python 进程间通信传递对象 python进程间通信queue
转载
#进程间通信--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)
'''
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。