在 Python 完成后终止线程

Terminating a thread on completion in Python

有什么方法可以让线程在完成其目标函数后自行终止?

我有一个应用程序需要 运行每 2 分钟等待一次连接功能。此功能需要大约 5 秒到 运行.

import time
import threading

count = 0 

def fivesecondwait():
    time.sleep(5)
    print("Finished side function")

t = threading.Thread(target = twentysecondwait)

while True:
  if count == 10:
    count = 0
    t.start()

  print("Running Main Application")
  count += 1
  time.sleep(1)

如果我尝试加入线程,循环将停止 运行ning,但如果我不包含加入,则会导致错误“线程只能启动一次”。我需要每 10 秒调用一次该函数并且不阻止循环的执行。那么有什么方法可以让线程自行终止以便再次使用它吗?

这适用于需要每 50 毫秒继续测量一次的测量设备,同时反复等待 3-4 秒以等待来自 MQTT 主机的连接。

你的问题和你的代码似乎不太匹配,但这是真的;你说,”它导致错误“线程只能启动一次”, 并且你的代码似乎创建了一个 thread 实例,然后它尝试 start()不止一次

错误消息是不言自明的。 Python 将 不会 允许您在同一个 thread 实例 t 上多次调用 t.start()。原因是,thread 不仅仅是一个对象。它是一个代表代码执行的对象(即,通过代码的旅程。)

同一次旅行不能多次。即使你去了去年去过的同一个海滩,即使你走同样的路线,在所有同样的地方停下来休息,这仍然是一次不同的旅行。线程服从相同的模型。

如果你想 运行 twentysecondwait() 多次“在后台”,这没有错,但你必须创建并启动一个新的 thread 实例每次执行。


Is there a practical limit to how many thread instances can be created?

对于顺序创建和销毁的数量可能没有实际限制,*但是每个运行宁线程占用大量内存并使用其他资源。所以,是的,有多少线程可以同时“活着”是有限制的。

您的示例线程函数需要 20 秒才能执行。如果程序每 10 秒启动一个新线程,那么活动线程的数量将每 20 秒增加一个——每小时 180 个。程序肯定撑不过90天


* 持续创建和销毁线程的一种性能更好的替代方法是使用 thread pool such as Python's concurrent.futures.ThreadPoolExecutor.

** 限制将取决于您 运行ning 的 Python 版本,运行ning 的 OS 版本,以及多少 运行ning您的计算机具有的内存等。在任何情况下都可能没有很好地定义限制。

线程完成后会自动终止运行。

但是:

a) 你不能启动同一个线程两次并且

b) 你不能 re-start 终止的线程。

简单的解决方案:始终启动一个新线程。

while True:
  if count == 10:
    count = 0
    t = threading.Thread(target = fivesecondwait)
    t.start()
  ...

[...] so it can be used again?

没有。但是,您可以保留一个线程 运行 并使用 synchronization objects 告诉线程什么时候做某事,什么时候不做。

这将需要更多的知识,但不会占用太多资源。