簡體   English   中英

在Python 3中使用SIGTERM時,允許進程完成而不是被中斷

[英]Allow process to finish rather than be interrupted when SIGTERM is used in Python 3

我正在開發一些代碼,當從UNIX中的命令行發送sigterm信號時,需要正常關閉。 我發現這個示例https://stackoverflow.com/a/31464349/7019148效果很好,但是存在一個問題。

碼:

import signal
import time


class GracefulKiller:

    def __init__(self):
        signal.signal(signal.SIGTERM, self.exit_gracefully)
        self.kill_now = False

    def exit_gracefully(self, signum, frame):
        self.kill_now = True

    def run_something(self):
        print("starting")
        time.sleep(5)
        print("ending")


if __name__ == '__main__':
    killer = GracefulKiller()
    print(os.getpid())
    while True:
        killer.run_something()
        if killer.kill_now:
            break

    print("End of the program. I was killed gracefully :)")

當您通過kill命令kill -15 <pid> ,run_something方法被中斷,進程被正常終止。 但是,是否有一種方法可以使run_something方法在終止進程之前完成? 即防止打擾?

所需的輸出:

>>> starting
*kill executed during the middle sleep*
>>> ending
>>> End of the program. I was killed gracefully :)

我的用例是,它將變成一個下載腳本,如果我想終止該過程,我希望該過程在終止之前完成下載...

即使捕獲到退出信號, thread.join()等到線程完成。

import threading
import Queue
import time

def download_for(seconds=5):
    for i in range(seconds):
        print("downloading...")
        time.sleep(1)

    print("finished download")


download_thread = threading.Thread(target=download_for, args=(3,))

download_thread.start()
# this waits till the thread finishes even if an exit signal was received
download_thread.join()

# this would just stop the download midway
# download_for(seconds=5)

答案在原始問題中。 我只是把這個留給以后的Google搜索者。

我從來沒有遇到過任何問題,我的終端只是在執行kill命令后打印“結束”時遇到了問題。

暫無
暫無

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

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