多进程系列之Queue类

135 阅读2分钟

在使用多进程的过程中,最好不要使用共享资源。普通的全局变量是不能被子进程所共享的,只有通过multiprocessing组件构造的数据结构可以被共享。

Queue是用来创建进程间资源共享的队列的类,使用Queue可以达到多进程间数据传递的功能。但是Queue只能在Process类中使用,不能再Pool类中使用。

1.基本介绍

1.1 构造方法

Queue([maxsize])

maxsize是队列中允许最大项数,省略则为无限大队列

1.2 实例方法

put():用来在队列中插入数据。该方法有2个可选参数:blocked和timeout。若blocked的值为True(默认值)且timeout的值大于0,该方法会阻塞timeout的时间,直到该队列有剩余的空间。超时抛出Queue.Full异常。若blocked的值为False,且Queue已满,则会立即抛出Queue.Full异常

get():从队列获取一个元素并且删除该元素,类似于列表的pop()方法。该方法也有2个可选参数:blocked和timeout。若blocked的值为True(默认值)且timeout的值大于0,会在timeout的时间内没有获取到抛出Queue.Empty异常。若blocked的值为False,且队列有一个元素可用,则返回该元素。若blocked的值为False,且队列为空则抛出Queue.Empty异常。设置blocked的值为True或者参数全部置空可以防止Queue在empty的时候抛出异常。

put_nowait():同put(blcoked=False)

get_nowait():同get(blcoked=False)

empty():判断队列是否为空。但是该方法在队列为空返回True时不可靠,比如返回True时put()方法插入了新的数据。

full():判断队列是否已满,该方法也不可靠,比如返回True时get()方法取走了数据。

qsize():返回队列中目前元素的数量,也不可靠,原因同empty()和full()

2.使用示例

from multiprocessing import Queue, Process
import os
import time
import random
​
​
def write(q):
    print(f'Process to write: {os.getpid()}')
    for value in range(5):
        print(f'put {value} to queue......')
        q.put(value)
        time.sleep(random.random())
​
​
def read(q):
    print(f'Process to read: {os.getpid()}')
    while True:
        value = q.get(True)
        print(f'get {value} from queue......')
​
​
if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    pw.start()
    pr.start()
    pw.join()
    pr.terminate()

result:

Process to write: 2856
put 0 to queue......
Process to read: 17560
get 0 from queue......
put 1 to queue......
get 1 from queue......
put 2 to queue......
get 2 from queue......
put 3 to queue......
get 3 from queue......
put 4 to queue......
get 4 from queue......

\