2013-08-01 31 views
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但似乎没有奏效。

回答

0

它看起来像你用SIGTERM调用signal.signal,而不是SIGINT。不是CTRL-C通常会产生一个SIGINT,而不是SIGTERM? [1]

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

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

+0

糟糕,你说得对。我想我正在使用SIGINT,但将其复制到我的测试代码中是错误的。我已经用'SIGINT'更新了问题和一些示例输出。 – jberryman

相关问题