簡體   English   中英

無法使用python eventlet庫(eventlet.timeout.Timeout)超時

[英]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是並發網絡庫...

目前還不清楚是什么expr2bddsatisfy_all功能做的,但最有可能,他們只能做一些CPU的計算和無磁盤/網絡IO。 在這種情況下,Eventlet沒有機會運行並引發超時異常。

如果你有控制expr2bddsatisfy_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.TimeoutThread.join()與超時一起使用。如果超時觸發時,請使用p.terminate()p.kill()停止當前計算。

暫無
暫無

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

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