【发布时间】:2017-03-09 01:59:57
【问题描述】:
我有一个 python 脚本,它使用 multiprocessing.Process 类生成一个新进程。这个过程应该永远运行以监控东西。在 Unix 上,我现在可以使用 os.kill() 向该特定进程发送信号,并在该进程中使用 signal.signal(...) 来实现我的特定中断处理程序。在 Windows 上无法正常工作。
我阅读了使用popen 的方法。我也可以为 Process 类指定 CREATE_NEW_PROCESS_GROUP 标志吗?以及如何?
这是我的示例代码:
import multiprocessing as mp
import time
import signal
import os
import platform
def my_h(signal, frame):
print("recieved signal", signal)
raise InterruptedError
def a_task():
signal.signal(signal.SIGINT, my_h)
print("this is 'a_task'", os.getpid())
try:
while True:
print(time.time())
time.sleep(1)
except Exception as e:
print(type(e), e)
print("'a_task' is at end")
if __name__ == '__main__':
p = mp.Process(target=a_task)
p.start()
time.sleep(1)
if platform.system() == 'Windows':
print("send CTRL_C_EVENT")
os.kill(p.pid, signal.CTRL_C_EVENT)
elif platform.system() == 'Linux':
print("send SIGINT")
os.kill(p.pid, signal.SIGINT)
time.sleep(3)
try:
os.kill(p.pid, signal.SIGTERM)
except:
pass
【问题讨论】:
-
我认为其他解决方案可以解决您的问题。 stackoverflow.com/questions/1230669/…
-
ẁell 这不仅仅是终止进程,而是确保在停止之前执行
except子句 -
多处理是自包含的,并没有提供太多的钩子让您修改它的行为方式。
_winapi.CreateProcess调用是硬编码的。我不建议对其进行猴子修补——尤其是对于像这样可疑的东西。 Windows 不实现信号。CTRL_C_EVENT和CTRL_BREAK_EVENT是控制台控制事件,因此仅在通过 python.exe 或附加到 conhost.exe 实例的类似控制台模式可执行文件运行时才有效。它不能通过 pythonw.exe、另一个 GUI 脚本包装器或作为服务工作(服务可执行文件是独立运行的)。
标签: python windows signals python-multiprocessing