簡體   English   中英

在 Python 完成時終止線程

[英]Terminating a thread on completion in Python

有沒有辦法讓線程在完成其目標 function 后自行終止?

我有一個應用程序需要每 2 分鍾運行一次等待連接 function。 這個 function 運行大約需要 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 秒調用一次 function 並且不阻止循環的執行。 那么有沒有辦法讓線程自行終止以便再次使用它呢?

這是針對需要每 50 毫秒繼續測量一次,同時重復等待 3-4 秒以連接來自 MQTT 主機的測量設備。

你的問題和你的代碼似乎不太匹配,但這是真的; 你說, “它會導致錯誤“線程只能啟動一次”,並且你的代碼似乎創建了一個thread實例,然后它多次嘗試start()

錯誤消息是不言自明的。 Python 將不允許您在同一個thread實例t上多次調用t.start() 原因是,一個thread不僅僅是一個 object。它是一個 object,代表您的代碼的執行(即,通過您的代碼。)

您不能多次進行同一次旅行。 即使你 go 到你去年去過的同一個海灘,即使你走同樣的路線,並在所有相同的地方停到 rest,這仍然是一次不同的旅行。 線程遵循相同的 model。

如果您想“在后台”多次運行twentysecondwait() ,這沒有任何問題,但您必須為每次執行創建並啟動一個新的thread實例。


可以創建多少個線程實例有實際限制嗎?

對於可以順序創建和銷毀的數量可能沒有實際限制,*但每個運行的線程占用大量 memory 並使用其他資源。 所以,是的,有多少線程可以同時“活着”是有限制的。

您的示例線程 function 需要 20 秒才能執行。 如果程序每 10 秒啟動一個新線程,那么活動線程的數量將每 20 秒增加一個——每小時 180 個。 該計划肯定無法維持 90 天。


* 一個更好的連續創建和銷毀線程的替代方法是使用線程池,例如 Python 的concurrent.futures.ThreadPoolExecutor

** 限制將取決於您正在運行的 Python 的版本、您正在運行的操作系統、您的計算機有多少 memory 等。在任何情況下,該限制可能都沒有明確定義。

線程在運行結束后會自動終止。

但:

a)你不能兩次啟動同一個線程並且

b) 你不能重新啟動一個終止的線程。

簡單的解決方案:始終啟動一個新線程。

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

[...] 所以它可以再次使用?

不,但是您可以保持單個線程運行並使用同步對象來告訴線程何時做某事,何時不做。

這將需要更多的知識,但資源密集度較低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM