Last Updated on 2022-01-05 by Clay
最近我在進行程式撰寫時,有了這樣一個奇怪的需求:我的程式解決一個問題基本會在一分鐘左右,但是如果超過一分鐘我需要放棄這項任務,繼續轉向下個任務。
在網路上也有查詢到,有些開發者可能會需要計算程式執行的秒數,如果超過一定時間則判斷系統卡死,便需要終止程式。
這些需求,在 Python 中通通都可以使用 eventlet 函式庫來完成。
eventlet 函式庫介紹
在這裡我不打算太詳細地紀錄 eventlet 函式庫的原理,畢竟我手上的專案快要截止了,做這個紀錄做得很急;另外,網路上大部分的筆記都已經紀錄得很詳細了。
簡單來說,eventlet 實現了一個稱為綠色執行緒(green thread)的原理,是一個虛假的併發,其實還是在單個執行緒內工作。
這樣的好處是消耗比較少,也能在不阻塞我們工作的同時另外進行計時 —— 是的,就是我今天要紀錄的需求:在程式執行超過一定時間後終止程式。
以下是一段範例。
如何使用 eventlet 函式庫
不能免俗地,我們需要使用 pip
工具來安裝套件:
pip3 install eventlet
安裝結束後,我們來看一段簡短的範例程式碼:
import time
import eventlet
def main():
# Init
eventlet.monkey_patch()
i = 0
while True:
isContinue = False
with eventlet.Timeout(5, False):
i += 1
print("{}s...".format(i))
time.sleep(i)
# If program execute here, the while-loop will continue
isContinue = True
# break out the while-loop
if isContinue == False:
break
# Display the stop point
print("The program is stop at i={}!".format(i))
if __name__ == "__main__":
main()
Output:
1s...
2s...
3s...
4s...
5s...
The program is stop at i=5!
可以看到,我在程式中設定了一個名為 isContinue
變數。當我們的程式在 5 秒內執行完畢時,會將 isContinue
設為 True
,於是 while
迴圈就會繼續下去;一但我們的程式超過 5 秒的限制,isContinue
就會在沒有設定為 True
的情況下導致我們跳出迴圈,終止了程式。
這可以很方便地添加在我現有的程式中,故特此記錄下來。
References
- https://pypi.org/project/eventlet/
- https://stackoverflow.com/questions/16310037/what-are-the-benefits-of-using-the-eventlet-module-in-python-over-the-threading