在不使用.join()且不阻塞主线程的情况下清理线程

时间:2019-08-06 13:39:04

标签: python python-3.x multithreading asynchronous

我处在两个端点可以要求值的情况下,一个端点可能比另一个端点更快。到端点的调用被阻止。我想等待一个完成,而不必等待另一个完成。

我的解决方案是在单独的线程中发出请求,并让这些线程在完成时将标志设置为true。在主线程中,我不断检查标志(我知道这是一个繁忙的等待,但是现在这不是我的主要关注),当标志完成时,它将获取该值并将其作为结果返回。

我遇到的问题是,我从不清理其他线程。如果不使用.join(),我将找不到任何方法,因为这样做只会阻碍并破坏整个目标。那么,如何在不从主线程加入的情况下清理另一个较慢的阻塞线程呢?

2 个答案:

答案 0 :(得分:1)

您想要的是使线程daemon s,所以当您获得结果并完成主线程时,将迫使另一个正在运行的线程完成。为此,您可以将daemon关键字更改为True

tr = threading.Thread(daemon=True)

threading文档中:

  

此标志的含义是整个Python程序均退出   当只剩下守护程序线程时。

尽管:

  

守护程序线程在关闭时突然停止。他们的资源(例如   因为打开的文件,数据库事务等)可能不会发布   正确地。如果您想让线程正常停止,请设置它们   非守护程序,并使用诸如Event之类的适当信令机制。

我对Event没有任何特殊的经验,因此无法详细说明。随时单击链接并继续阅读。

答案 1 :(得分:0)

一个糟糕的解决方案是为关闭正在阻塞的套接字的线程实现方法。现在,您必须在主线程中捕获异常。