队列get函数和get_nowait函数及异常捕获

本文详细介绍了Python中使用multiprocessing模块的Queue进行进程间通信的方法,包括如何创建队列、向队列中添加元素、检查队列状态以及从队列中获取元素等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import multiprocessing
import time

if __name__ == '__main__':
    # 创建消息队列
    # 3: 表示消息队列最大个数
    queue = multiprocessing.Queue(3)
    # 放入数据
    queue.put(1)
    queue.put("abc")
    queue.put(["abc", "456"])
    # 队列满了在放入数据, 就不能放入数据了,直到消息队列有空闲位置才能再放入数据
    # queue.put(("34", 90))
    # put_nowait: 不会等待队列有空闲位置再放入数据,如果数据放入不成功就直接崩溃
    # queue.put_nowait(("34", 90))
    # 建议: 放入数据使用put,因为比较安全不会崩溃

    # 查看队列是否是满的
    # result = queue.full()
    # print(result)
    # 坑点: 只使用put放入数据直接判断队列是否为空获取的结果不正确,因为没有等队列把数据写完直接就取获取了,那么这是队列是空的
    # for i in range(10000):
    #     print(i)
    # 解决办法: 1. 延时一段时间  2. 通过个数去判断
    # time.sleep(0.001)
    #
    if queue.qsize() == 0:  # mac 版本不能使用qsize()
        print("队列是空的")

    # result = queue.empty()
    # print(result)


    # 查看队列的个数
    size = queue.qsize()
    print("消息队列个数:", size)
    # 获取队列的数据
    value = queue.get()
    print(value)
    size = queue.qsize()
    print("消息队列个数:", size)
    # 获取队列的数据
    value = queue.get()
    print(value)
    size = queue.qsize()
    print("消息队列个数:", size)
    # 获取队列的数据
    value = queue.get()
    print(value)
    size = queue.qsize()
    print("消息队列个数:", size)

    # 队列为空, 使用get会等待,直到队列有数据以后再取值
    # value = queue.get()
    # print(value)
    # 队列为空,取值的时候不等待,但是取不到值那么直接崩溃了
    # value = queue.get_nowait()
    # print(value)
    # 建议: 获取队列的数据统一get,因为能保证代码不会有问题
  try:
        value = queue.get(timeout = 1)
    finally:
        print(value)
        size = queue.qsize()
        print("消息队列个数:", size)

        print("结束!")

当队列为空时,再调用get函数,程序会阻塞,导致无法正常执行后面的代码,程序也不会退出,可以用get_nowait函数,当队列为空,不会等待,直接抛出异常,若想输出后面的内容,可以用try…finally…捕获异常执行。附:(timeout = 1可作为函数的参数)

### Python 中 `queue.Queue` 的使用示例 在多线程或多进程环境中,`queue.Queue` 是一种非常有用的工具来协调不同线程之间的数据传递。下面是一个典型的例子,展示如何在一个循环中使用 `queue.get()` 方法。 #### 使用 `while True` `queue.get()` 当处理队列时,通常会结合无限循环 (`while True`) 来不断获取并处理队列中的项目。如果队列为空,则可以设置阻塞行为或者超时机制以防止死锁[^1]。 以下是完整的代码示例: ```python import threading import queue import time def worker(q): while True: try: item = q.get(timeout=5) # 设置超时时间避免永久阻塞 if item is None: # 如果接收到特殊信号 (None),则退出循环 break print(f'Processing {item}') # 处理逻辑在此处完成... q.task_done() except queue.Empty: print("Queue empty, stopping worker.") break if __name__ == "__main__": my_queue = queue.Queue() # 向队列中放入一些任务项 for i in range(10): my_queue.put(i) thread = threading.Thread(target=worker, args=(my_queue,)) thread.start() # 等待所有任务完成 my_queue.join() # 发送停止信号给工作者线程 my_queue.put(None) thread.join() ``` 在这个例子中,我们创建了一个名为 `worker` 的函数作为单独的线程运行目标。该线程持续从队列中取出项目直到遇到特定结束标志(这里是 `None`),从而优雅地终止循环。 另外需要注意的是,在实际应用中可能还需要考虑异常捕获以及资源清理等问题,上述代码仅提供基本框架供参考[^2]。 #### 非阻塞方式下的 `get_nowait()` 除了常规带等待功能的方法外,还有不带任何延迟直接尝试取值的方式——即调用 `get_nowait()` 函数。这种方式适用于那些希望立即知道是否有可用条目而不想陷入长时间挂起状态的应用场景下[^3]: ```python try: item = q.get_nowait() except queue.Empty: pass # Handle empty queue situation here. ``` 以上展示了两种不同的方法用于管理基于 Queue 对象的任务分发流程;具体选用哪种取决于应用场景需求个人偏好等因素决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值