1
我正在使用multiprocessing.Manager
来跟踪我在并行结构任务中创建的资源。如果出现问题,我经常想要执行ctrl-c
来暂停任务,但是我仍然需要打印这些资源。在并行结构任务中处理SIGINT
我怎样才能让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但似乎没有奏效。
糟糕,你说得对。我想我正在使用SIGINT,但将其复制到我的测试代码中是错误的。我已经用'SIGINT'更新了问题和一些示例输出。 – jberryman