在使用多进程的过程中,最好不要使用共享资源。普通的全局变量是不能被子进程所共享的,只有通过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......
\