有沒有辦法讓執行緒在完成其目標功能后自行終止?
我有一個應用程式需要每 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)
如果我嘗試加入執行緒,則回圈停止運行,但如果我不包括加入,則會導致錯誤“執行緒只能啟動一次”。我需要每 10 秒呼叫一次函式并且不阻止回圈的執行。那么有什么方法可以讓執行緒自行終止,以便再次使用它?
這適用于需要每 50 毫秒繼續測量一次的測量設備,同時反復等待 3-4 秒以獲取來自 MQTT 主機的連接。
uj5u.com熱心網友回復:
您的問題和您的代碼似乎不太匹配,但這是真的;您說,“它會導致錯誤”執行緒只能啟動一次“,并且您的代碼似乎創建了一個thread實體,然后它會嘗試start()多次。
錯誤訊息是不言自明的。Python不允許您在同一個實體t.start()上多次呼叫. 原因是,a不僅僅是一個物件。它是一個物件,代表您的代碼的執行(即,通過您的代碼旅行。)threadtthread
您不能多次參加同一趟旅行。即使你去去年訪問過的同一個海灘,即使你沿著相同的路線,在所有相同的地方停下來休息,這仍然是一次不同的旅行。執行緒遵循相同的模型。
如果您想twentysecondwait()“在后臺”運行多次,這沒有什么問題,但是您必須thread為每次執行創建并啟動一個新實體。
可以創建多少個執行緒實體是否有實際限制?
對于可以按順序創建和銷毀的數量可能沒有實際限制*,但每個正在運行的執行緒都會占用大量記憶體并使用其他資源。所以,是的,有多少執行緒可以同時“活著”是有限制的。
您的示例執行緒函式需要 20 秒才能執行。如果程式每 10 秒啟動一個新執行緒,那么活動執行緒的數量將每 20 秒增加一個——每小時 180 個。該計劃肯定無法維持 90 天。
* 一個更好的替代持續創建和銷毀執行緒的方法是使用執行緒池,例如 Python 的concurrent.futures.ThreadPoolExecutor.
** 限制將取決于您正在運行的 Python 版本、您正在運行的作業系統、您的計算機有多少記憶體等。無論如何,該限制可能都沒有明確定義。
uj5u.com熱心網友回復:
執行緒完成運行后會自動終止。
但:
a) 你不能兩次啟動同一個執行緒并且
b)您無法重新啟動已終止的執行緒。
簡單的解決方案:總是啟動一個新執行緒。
while True:
if count == 10:
count = 0
t = threading.Thread(target = fivesecondwait)
t.start()
...
[...] 所以它可以再次使用?
不。但是,您可以保持單個執行緒運行并使用同步物件來告訴執行緒什么時候做某事,什么時候不做。
這將需要更多的知識,但資源密集度較低。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442898.html
標籤:Python 多线程 python-多线程
