进程间通信-Queue
•多进程之间,默认是不共享数据的
•通过Queue(队列Q)可以实现进程间的数据传递
•Q本身是一个消息队列
•如何添加消息(入队操作):
#如何添加消息(入队操作)
from multiprocessing import Queue
q=Queue(3)#初始化一个Queue对象,最多可接受3条消息
q.put("消息1")
q.put("消息2")
q.put("消息3")
print(q.full())
•可以使⽤multiprocessing模块的Queue实现多进程之间的数据传递
•初始化Queue()对象时(例如: q=Queue()),若括号中没有指定最⼤可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限
•Queue.qsize():返回当前队列包含的消息数量
•Queue.empty(): 如果队列为空,返回True, 反之False
•Queue.full(): 如果队列满了,返回True,反之False
•Queue.get([block[, timeout]]):获取队列中的⼀条消息, 然后将其从队列中移除, block默认值为True(此处block是阻塞的意思,True表示为阻塞状态)
–如果block使⽤默认值,且没有设置timeout(单位秒) , 消息队列如果为空, 此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为⽌.
from multiprocessing import Process,Queue
def run(q):
print(q.get())
if __name__ == '__main__':
q = Queue()
p=Process(target=run,args=(q,))
p.start()
p.join()
如果设置了timeout, 则会等待timeout秒,若还没读取到任何消息, 出"Queue.Empty"异常
如果block值为False,消息队列如果为空, 则会⽴刻抛出“Queue.Empty”异常
from multiprocessing import Process,Queue
def run(q):
print(q.get(block=True,timeout=1))
if __name__ == '__main__':
q = Queue()
p=Process(target=run,args=(q,))
p.start()
p.join()
•Queue.get_nowait(): 相当于Queue.get(False) nowait 不等待 也就是相当于 不设置阻塞,block为False
•Queue.put(item,[block[, timeout]]): 将item消息写⼊队列, block默认值为True
–如果block使⽤默认值, 且没有设置timeout(单位秒) , 消息列队如果已 经没有空间可写⼊, 此时程序将被阻塞(停在写⼊状态),直到从消息列队腾出空间为⽌,如果设置了True和timeout, 则会等待timeout秒, 若还没空间, 则抛出"Queue.Full"异常
–如果block值为False,消息队列如果没有空间可写⼊, 则会⽴刻抛出"Queue.Full"异常
Queue.put_nowait(item): 相当Queue.put(item, False).