Skip to content

[Python] 使用 eventlet 函式庫在程式執行超過一定時間後自動終止程式

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


Read More

Tags:

Leave a Reply