在并行结构任务中处理SIGINT

时间:2013-08-01 17:57:32

标签: python multithreading exception fabric

我正在使用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隐藏信号,但似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

看起来你用SIGTERM调用signal.signal,而不是SIGINT。 CTRL-C通常不会导致SIGINT,而不是SIGTERM? [1]

我会尝试使用SIGINT而不是SIGTERM和signal.signal()。

[1] https://en.wikipedia.org/wiki/Control-C