进程间通信(multiprocess.Queue)

进程间通信(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
队列已空
'''
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾维斯Echo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值