我可以釀出這一個新的線程,並指定。加入)時間(方法,但我不能輕易得到的結果出來的
如果超時,這意味着該方法沒有完成,所以沒有結果。如果你有增量結果,你可以將它們存儲在某個地方,然後將它們讀出來(不管你喜歡什麼)(記住threadsafety)。
使用基於SIGALRM的系統是非常危險的,因爲它可以在任何時候提供異步信號,即使在除了最終處理程序期間,您也不期待它。 (其它語言處理這個更好的,可惜。)例如:
try:
# code
finally:
cleanup1()
cleanup2()
cleanup3()
的信號經由SIGALRM向上傳遞cleanup2期間可能發生(),這將導致cleanup3()將永遠不會被執行。 Python根本無法以一種既不合作又不安全的方式終止正在運行的線程。
您應該讓代碼自行檢查超時。
import threading
from datetime import datetime, timedelta
local = threading.local()
class ExecutionTimeout(Exception): pass
def start(max_duration = timedelta(seconds=1)):
local.start_time = datetime.now()
local.max_duration = max_duration
def check():
if datetime.now() - local.start_time > local.max_duration:
raise ExecutionTimeout()
def do_work():
start()
while True:
check()
# do stuff here
return 10
try:
print do_work()
except ExecutionTimeout:
print "Timed out"
(當然,這屬於一個模塊中,所以代碼實際上看起來像 「timeout.start()」; 「timeout.check()」。)
如果您正在生成動態編碼,然後在每個循環的開始處生成一個timeout.check()調用。
即使是來自可靠來源,你可以只使用'進口source',每當它的變化,用'重裝(源)'。這樣,您不會污染全局名稱空間。你必須使用'source.run()'。 – voyager 2009-09-25 14:53:38