进程间通信(multiprocess.Queue)
进程间通信机制简称 IPC (Inter Process Communication)
进程间彼此隔离, 要实现 IPC, multiprocessing 模块为我们提供了队列和管道这两种形式
1.什么是管道, 什么是队列
- 管道(了解即可) : 一个进程将一个数据放入管道内(共享内存), 另一个进程从管道内取出数据进行处理
- 队列 : 管道加锁, 先进先出, 帮我们实现了复杂的加锁解锁操作, 以下我们主要介绍队列的使用
2.队列的常用方法
- 创建一个队列实例
🍑导入模块
from multiprocessing import Queue
🍑创建一个队列对象
q = Queue([maxsize]) # 多进程可以使用Queue进行数据传递
🍑参数介绍
maxsize # 是队列中允许最大项, 省略则无大小限制
- 常用方法介绍
方法 | 功能 |
---|---|
q.put( ) | 向队列中传入数据,可选参数 : blocked(锁定状态)和timeout(超时时间)。如果blocked为True(默认值), 并且timeout为正值, 该方法会阻塞timeout指定的时间, 直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常 |
q.get( ) | 从队列读取走一个元素, 有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常 |
q.get_nowait( ) | 同q.get(blocked=False) |
q.put_nowait( ) | 同q.put(blocked=False) |
q.empty( ) | 调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目 |
q.full( ) | 调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走 |
q.qsize( ) | 返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样 |
- 其他方法介绍
方法 | 作用 |
---|---|
q.cancel_join_thread( ) | 不会在进程退出时自动连接后台线程, 可以防止join_thread()方法阻塞 |
q.close( ) | 关闭队列, 防止队列中加入更多数据。调用此方法,后台线程将继续写入那些已经入队列但尚未写入的数据,但将在此方法完成时马上关闭。如果q被垃圾收集,将调用此方法。关闭队列不会在队列使用者中产生任何类型的数据结束信号或异常。例如,如果某个使用者正在被阻塞在get()操作上,关闭生产者中的队列不会导致get()方法返回错误 |
q.join_thread( ) | 连接队列的后台线程。此方法用于在调用q.close()方法之后,等待所有队列项被消耗。默认情况下,此方法由不是q的原始创建者的所有进程调用。调用q.cancel_join_thread方法可以禁止这种行为 |
3.队列的使用
from multiprocessing import Queue
q = Queue(3) # 创建一个队列,设置最大项为3
q.put({"name":"ii"}) # 放入一个字典
q.put([1,2,3,4,5]) # 放入一个列表
q.put("shawn") # 放入一个字符串
try:
# q.put(1777,block=True,timeout=3)
q.put(1777,block=False) # 放入一个整形,并设置队列已满立马抛异常
except Exception:
print("队列已满")
print(q.get()) # 取一个值
print(q.get()) # 2
print(q.get()) # 3
try:
# print(q.get(block=True,timeout=3))
print(q.get(block=False)) # 取一个值,队列为空立马抛出异常
except Exception:
print("队列已空")
'''输出
队列已满
{'namwe': 'ahsns'}
[1, 2, 3, 4, 5]
shawn
队列已空
'''