我正在使用 amultiprocessing.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
安排,用这种方法隐藏了信号,但似乎没有任何效果。