使用 KeyboardInterrupt python 唤醒挂起进程



我正在使用一个有时属于无限循环的库。此库中的所有操作都会被记录下来,我使用线程来检测调用何时使用库日志进入无限循环。检测到循环后,我需要向挂起进程发送KeyboardInterrupt等信号以终止当前调用并清理问题,然后重做作业。这是我尝试过的代码:

import threading
import multiprocessing
def worker():
job_not_done = True
while job_not_done:
try:
call_a_library_function_that_may_fall_in_infinite_loop()
job_not_done = False
except KeyboardInterrupt:
do_some_clean_up()
print('Job interrupted, restarting ...')
def watcher(process):
infinite_loop = False
while not infinite_loop:
infinite_loop = detect_from_logs_if_inside_infinite_loop()
# send keyboardInterrupt signal to process
# process.sendSignal(KeyboardInterrupt) ??
p = multiprocessing.Process(target=starter)
p.start()
t = threading.Thread(target=watcher, args=(p,))
t.setDaemon(True)
t.start()
p.join()

我四处搜索,但找不到如何将所需的信号发送到子进程。简单地打电话给process.terminate()会杀死它,显然不是我想要的。知道吗?

在基于 Unix 的系统中,SIGINT信号用于指示这一点。 信号与kill(2)一起发送,在Python中以os.kill形式公开,信号编号在signal包中。

您的使用如下所示:

from os import kill
from signal import SIGINT
kill(process.pid, SIGINT)

最新更新