1

を使用し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

4

1 に答える 1

0

SIGINT ではなく SIGTERM で signal.signal を呼び出しているようです。CTRL-C は通常、SIGTERM ではなく SIGINT になりますか? [1]

signal.signal() で SIGTERM の代わりに SIGINT を使用してみます。

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

于 2013-08-01T18:11:36.720 に答える