如何等到只有第一个线程在 Python 中完成

新手上路,请多包涵

要求是启动五个线程,只在最快的线程中等待。 5 个线程都去 5 个方向寻找相同的数据,一个就足够继续控制流了。

实际上,我需要等待前两个线程返回,以相互验证。但我想如果我知道如何等待最快。我可以弄清楚如何等待第二快的。

很多人都在谈论 join(timeout) ,但是你事先不知道要等哪一个(提前申请 join )。

原文由 Stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 273
1 个回答

使用队列:每个线程完成后将结果放入队列,然后您只需要读取适当数量的结果并忽略其余部分:

 #!python3.3
import queue    # For Python 2.x use 'import Queue as queue'
import threading, time, random

def func(id, result_queue):
    print("Thread", id)
    time.sleep(random.random() * 5)
    result_queue.put((id, 'done'))

def main():
    q = queue.Queue()
    threads = [ threading.Thread(target=func, args=(i, q)) for i in range(5) ]
    for th in threads:
        th.daemon = True
        th.start()

    result1 = q.get()
    result2 = q.get()

    print("Second result: {}".format(result2))

if __name__=='__main__':
    main()

Queue.get() 的文档(没有参数它等同于 Queue.get(True, None)

Queue.get([块[, 超时]])

从队列中删除并返回一个项目。如果可选参数 block 为 true 且 timeout 为 None(默认值),则在必要时阻止直到项目可用。如果超时是正数,它最多会阻塞超时秒数,如果在该时间内没有可用的项目,则会引发 Empty 异常。否则(块为假),如果一个项目立即可用,则返回一个项目,否则引发 Empty 异常(在这种情况下忽略超时)。

原文由 Duncan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题