在 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 告诉线程什么时候做某事,什么时候不做。
这将需要更多的知识,但不会占用太多资源。
有什么方法可以让线程在完成其目标函数后自行终止?
我有一个应用程序需要 运行每 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 告诉线程什么时候做某事,什么时候不做。
这将需要更多的知识,但不会占用太多资源。