簡體   English   中英

Python,超時嘗試,超過X秒后的語句?

[英]Python, Timeout of Try, Except Statement after X number of seconds?

我一直在尋找這個,但似乎無法找到一個確切的答案(大多數進入更復雜的事情,如多線程等),我只是想做一些像Try,Except聲明,如果過程沒有完成在X秒內,它將拋出異常。

編輯:原因是我使用的網站測試軟件(selenium)的配置有時會導致它掛起。 它不會拋出錯誤,不會超時或做任何事情,所以我無法捕獲它。 我想知道最好的方法是確定這已經發生了所以我可以繼續我的應用程序,所以我在想我是否可以做一些事情,“如果這還沒有完成X秒......繼續前進” 。

如果沒有某種多線程或多處理,你就無法做到這一點,即使它隱藏在某些抽象層之下,除非你正在運行的“進程”是專門為異步性設計的,並且偶爾回調一個已知的函數。

如果您描述該過程實際上是什么,那么提供真正的解決方案會更容易。 我不認為你欣賞Python的強大功能,它涉及到完整的簡潔實現。 即使使用多線程/多處理,也可能只需要幾行代碼即可實現。

答案(和問題)並不特定於try / except語句。 如果你想要一個不是無限的無限循環(但在一段時間后停止),它可能不應該是無限的。 例如,將其更改為使用:

while time <= some_value:

或者在循環體上添加一個額外的檢查,使其在您希望停止時中斷:

while True:
    ...
    if time > some_value:
        break

如果那是不可能的(例如,因為你根本不控制循環),事情會變得更加困難。 在許多系統中,你可以使用signal.alarm有一段時間后送達的信號,然后對信號處理signal.SIGALRM能提高網站TimeoutError例外。 根據無限循環的實際作用,這可能會也可能不會起作用; 如果它阻止信號,或捕獲和忽略異常,或以任何其他方式干擾信號處理程序,那將無法工作。 另一種可能性是不在當前過程中進行循環,而是在另一個循環中進行循環; 然后,您可以隨意終止單獨的流程。 然而,除了終止它之外做任何事情並不容易,因此清理或恢復部分工作非常困難。 (線程根本不起作用,因為沒有辦法中斷執行無限循環的單獨線程。)

如果您使用的是UNIX的通用解決方案:

import time as time
import signal

#Close session
def handler(signum, frame):
    print 1
    raise Exception('Action took too much time')


signal.signal(signal.SIGALRM, handler)
signal.alarm(3) #Set the parameter to the amount of seconds you want to wait

try:
    #RUN CODE HERE

    for i in range(0,5):
        time.sleep(1)
except:
    print 2

signal.alarm(10) #Resets the alarm to 10 new seconds
signal.alarm(0) #Disables the alarm 

暫無
暫無

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

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