Lazulitecn 2023-01-17 10:40 采纳率: 84.8%
浏览 19
已结题

Python multiprocessing Queue为什么判断队列一直是空的呢?

使用while not url_queue.empty(),不会执行,用IF判断后发现url_queue一直为空,.empty()为TRUE,
而使用while True,虽然能够开始运行,但是执行完毕,队列空了后会卡住不会自动结束

  • 写回答

2条回答 默认 最新

  • ShowMeAI 2023-01-17 10:46
    关注

    在使用 multiprocessing.Queue 时,队列是在不同进程中共享的。如果您在一个进程中检查队列是否为空,而在另一个进程中将元素添加到队列中,则可能会出现队列被认为是空的情况。

    队列是空的,原因可能是你的生产者线程已经结束并将所有的数据放入队列了,而消费者线程还没有消费完。

    为了避免这种情况,您可以使用 Queue 类中的 join() 方法,它将阻塞直到队列中的所有元素都被消费。

    url_queue.join()
    

    您还可以使用 task_done() 方法来通知队列已经完成了某个任务。在消费者线程中,每当它处理完队列中的一个元素时,都应该调用 task_done()。

    while not url_queue.empty():
        url = url_queue.get()
        process_url(url)
        url_queue.task_done()
    

    这样生产者线程在放入一个元素后会调用 put(),消费者线程在消费一个元素后会调用 task_done(),这样就能检测队列中元素是否全部被消费。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 创建了问题 1月17日

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上