Python基础-进程中通信Queue

一、Queue的使用

1.multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序

2.Queue的使用

(1)实例化一个Queue对象:queue = multiprocessing.Queue(10)

10为最大可接受的消息数量,若括号中没有指定,或数量为负数,代表可接受的数量没有上线(直到内存尽头)

(2)Queue创建的实例对象常用方法

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

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

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

queue.put(item,[block[,timeout]]:将item消息写入队列,block默认值为True

1)bolck使用默认值(True)

①没有设置timeout(单位秒),消息队列如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息队列腾出空间为止

②设置了timeout,则会等待timeout秒,若还没空间,则抛出“queue.full”异常

2)block值为False,消息队列如果没有空间可写入,则会立刻抛出“queue.Full”异常

queue.put_nowait(item):相当于queue.put(item,False)

queue.get([nlock[,timeout]]):获取队列中的一条消息,然后将其从队列中移除,block默认为True

1)bolck使用默认值(True)

①没有设置timeout(单位秒),消息队列如果为空,此时程序将被阻塞(停在读取状态),直到从消息队列读到信息为止

②设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出“queue.Empty”异常

2)block值为False,消息队列如果为空,则会立刻抛出“queue.Empty”异常

queue.get_nowait():相当于queue.get(False)

3.消息队列Queue完成进程间通信的演练

(1)代码

import multiprocessing
import time

def write_data(queue):
    for i in range(10):
        if queue.full():
            print("队列满了")
            break
        queue.put(i)
        time.sleep(0.2)
        print("写入数据为:",i)

def read_data(queue):
    while True:
        # 队列空了退出
        if queue.qsize() == 0:
            print("队列空了")
            break
        value = queue.get()
        print("读取数据为:",value)

if __name__ == '__main__':
    # 创建消息队列
    queue = multiprocessing.Queue(6)
    write_process = multiprocessing.Process(target=write_data,args=(queue,))
    read_process = multiprocessing.Process(target=read_data,args=(queue,))
    # 启动写入进程
    write_process.start()
    # 写入进程结束后再继续读取进程
    write_process.join()
    read_process.start()

(2)结果

小结:

从队列取值使用get方法,向队列放入值使用put方法

消息队列判断队列是否为空不可靠,可以使用延迟和根据个数进行判断

猜你喜欢

转载自blog.csdn.net/qq_39620483/article/details/87692504