[英]Not able to timeout using python eventlet library (eventlet.timeout.Timeout)
我正在遍歷列表,並對列表的每個成員執行一些操作。 如果成員花費太多時間(在這種情況下為1秒),我打算通過它。 但是try
語句中的塊始終在處理,並且永遠不會超時 。 我不明白為什么。
from eventlet import *
for rule in data:
#Timeout block
t=Timeout(1)
try:
f = expr2bdd(expr(rule))
solutions = satisfy_all(f, count=True)
each_rule["solution"]=solutions
except:
pass
finally:
t.cancel()
Eventlet是並發網絡庫...
目前還不清楚是什么expr2bdd
和satisfy_all
功能做的,但最有可能,他們只能做一些CPU的計算和無磁盤/網絡IO。 在這種情況下,Eventlet沒有機會運行並引發超時異常。
如果你有控制expr2bdd
和satisfy_all
功能,有任何形式的循環,地點eventlet.sleep(0)
在每個迭代。 那是Eventlet的成語,意為“控制其他協程的產量”,這就是超時的地方。
如果您無法控制上述功能,則第二好的選擇是在一個單獨的進程中運行它們,您可以強制終止該進程。 在兼容POSIX的OS(例如Linux,* BSD,OSX)上,可以使用os.fork
在單獨的進程中運行一段代碼。 為了獲得最大的可移植性,請使用subprocess.Popen([sys.executable,...])
或multiprocessing.Process
。 后者提供了更高級別的API,主要是圍繞簡化數據交換(序列化)而付出的,而這是以性能開銷為代價的,在您的情況下,這可以忽略不計。 無論如何,基本模式是這樣的:(在線程或事件let協程中,啟動第二個進程,然后在其上執行eventlet.Timeout
.communicate()/join()
。將eventlet.Timeout
或Thread.join()
與超時一起使用。如果超時觸發時,請使用p.terminate()
或p.kill()
停止當前計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.