我正在使用multiprocessing.Manager
来跟踪我在并行结构任务中创建的资源。如果出现问题,我经常想要ctrl-c
来暂停任务,但是我仍然需要打印这些资源。
如何在退出之前使report_resources
始终运行并在以下代码中正常运行:
from time import sleep
from multiprocessing import Manager
from fabric.utils import puts
from fabric.context_managers import hide,settings
from fabric.api import env,task,execute
from fabric.colors import green
import atexit
import signal
env.resources_log = Manager().list()
def report_resources(x=None,y=None):
if env.resources_log:
puts(green( 'we really really want to print these, no matter what happens' ))
for r in env.resources_log:
puts(green('\t * '+str(r) ))
atexit.register(report_resources)
signal.signal(signal.SIGINT, report_resources) # This doesn't work at catching ctrl-c in multiprocessing code
@task
def test():
def par_task():
env.resources_log.append("some resource")
puts( 'appended resource' )
# HIT CTRL-C HERE
sleep(10)
puts('starting multithreading')
with settings( hide("running","stdout")
, hosts=['foo','bar']
, parallel=True):
execute(par_task)
如果我让它运行我得到:
starting multithreading
[foo] appended resource
[bar] appended resource
Done.
we really really want to print these, no matter what happens
* some resource
* some resource
但是如果我在睡眠期间ctrl-c得到:
starting multithreading
[bar] appended resource
[foo] appended resource
^CTraceback (most recent call last):
File "/home/me/foo/lib/python2.7/site-packages/fabric/main.py", line 739, in main
[foo] we really really want to print these, no matter what happens
*args, **kwargs
...
... lots of garbage
我尝试过各种try
/ catch
安排,用this method隐藏信号,但似乎没有任何效果。
答案 0 :(得分:0)
看起来你用SIGTERM调用signal.signal,而不是SIGINT。 CTRL-C通常不会导致SIGINT,而不是SIGTERM? [1]
我会尝试使用SIGINT而不是SIGTERM和signal.signal()。