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