我处在两个端点可以要求值的情况下,一个端点可能比另一个端点更快。到端点的调用被阻止。我想等待一个完成,而不必等待另一个完成。
我的解决方案是在单独的线程中发出请求,并让这些线程在完成时将标志设置为true。在主线程中,我不断检查标志(我知道这是一个繁忙的等待,但是现在这不是我的主要关注),当标志完成时,它将获取该值并将其作为结果返回。
我遇到的问题是,我从不清理其他线程。如果不使用.join()
,我将找不到任何方法,因为这样做只会阻碍并破坏整个目标。那么,如何在不从主线程加入的情况下清理另一个较慢的阻塞线程呢?
答案 0 :(得分:1)
您想要的是使线程daemon
s,所以当您获得结果并完成主线程时,将迫使另一个正在运行的线程完成。为此,您可以将daemon
关键字更改为True
:
tr = threading.Thread(daemon=True)
从threading
文档中:
此标志的含义是整个Python程序均退出 当只剩下守护程序线程时。
尽管:
守护程序线程在关闭时突然停止。他们的资源(例如 因为打开的文件,数据库事务等)可能不会发布 正确地。如果您想让线程正常停止,请设置它们 非守护程序,并使用诸如
Event
之类的适当信令机制。
我对Event
没有任何特殊的经验,因此无法详细说明。随时单击链接并继续阅读。
答案 1 :(得分:0)
一个糟糕的解决方案是为关闭正在阻塞的套接字的线程实现方法。现在,您必须在主线程中捕获异常。