在Python3中使用SIGTERM时,允许进程完成而不是中断

2024-09-24 16:34:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一些代码,当在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\u something方法会被中断,进程也会被优雅地终止。但是,有没有一种方法可以让run_something方法在进程被终止之前完成?即防止中断?在

期望输出:

^{pr2}$

我的用例是这将变成一个下载脚本,如果我想终止进程,我希望进程在终止之前完成下载。。。


Tags: 方法run代码importselfsignaltime进程
2条回答

答案在原来的问题里。我只是把这个留给未来的谷歌搜索者。在

我一开始就没有问题,我的终端只是在kill命令后打印“ending”时出现问题。在

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)

相关问题 更多 >