在Python中給定的時間量之後終止函數(仍在運行)的最佳方法是什麼?這是到目前爲止,我已經找到了兩種方法:在給定的時間量後終止python函數
這樣說,是我們的基本功能:
import time
def foo():
a_long_time = 10000000
time.sleep(a_long_time)
TIMEOUT = 5 # seconds
1.多重方法
import multiprocessing
if __name__ == '__main__':
p = multiprocessing.Process(target=foo, name="Foo")
p.start()
p.join(TIMEOUT)
if p.is_alive()
print('function terminated')
p.terminate()
p.join()
2.信號途徑
import signal
class TimeoutException(Exception):
pass
def timeout_handler(signum, frame):
raise TimeoutException
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(TIMEOUT)
try:
foo()
except TimeoutException:
print('function terminated')
這兩種方法在範圍,安全性和可用性方面有哪些優缺點?有沒有更好的方法?
感謝您接觸到信號的方法。我想我正在計劃使用多處理機制,因爲它具有並行性和簡單性。 – Anna
在多處理中,記住用try/except封裝你的p.terminate()。如果您的應用程序被大量使用,它最終會遇到罕見的情況,其中p.join()超時,因爲p仍在運行,p.is_alive()返回true,p在此之後立即完成,並且當您調用p.terminate()隨着p不再運行,將會引發異常。你可以很容易地忽略這個異常,因爲你的應用程序的狀態是你想要的(沒有運行),但是如果沒有被捕獲,你的主程序會在這個時候退出。 – Hannu
實際上,你不需要is_alive()檢查,因爲它不會提供任何額外的有用信息,因爲p可能會在is_alive和下一個命令之間死掉。只需在try/except內部調用p.terminate()並忽略異常。它要麼成功要麼失敗,你的p將會消失。 – Hannu