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 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)