繁体   English   中英

如何防止进程在KeyboardInterrupt上终止?

[英]How to prevent a process from terminating on a KeyboardInterrupt?

我一直在搞一个Django项目。 我要实现的是Django项目在另一个进程中启动,而父进程启动了我编写的任意代码(项目的后端)。 显然,Django进程和父进程进行通信。 我希望过程可以读取和写入字典。

根据此处的示例,我有以下代码:

#!/usr/bin/env python

from multiprocessing import Process, Manager
import os
import time
from dj import manage

def django(d, l):
    print "starting django"

    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.reverse()
    manage.start()

def stop(d, l):

    print "stopping"
    print d
    print l

if (__name__ == '__main__'):
    os.system('clear')
    print "starting backend..."
    time.sleep(1)
    print "backend start complete."

    manager = Manager()

    d = manager.dict()
    l = manager.list(range(10))

    p = Process(target=django, args=(d, l))
    p.start()

    try:
        p.join()
    except KeyboardInterrupt:
        print "interrupt detected"

    stop(d, l)

当我按CTRL + C stop() Django进程时,我看到Django服务器已关闭,并调用了stop() 然后我要看的是正在打印的字典d和列表l

输出为:

starting backend...
backend start complete.
starting django
Validating models...

0 errors found
Django version 1.3, using settings 'dj.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
^Cinterrupt detected
stopping
<DictProxy object, typeid 'dict' at 0x141ae10; '__str__()' failed>
<ListProxy object, typeid 'list' at 0x1425090; '__str__()' failed>

CTRL + C事件后找不到词典或列表。 发出SIGINT时,Manager进程是否已终止? 如果是,是否有其他方法可以阻止它终止于此并终止于主要过程?

我希望这是有道理的。 任何帮助都可以收到。

好的,到目前为止,我认为不可能简单地忽略异常。 当您上升一个时,如果有一个,您总是直接进入“ except”块。 我在这里建议的是在每个^ C上重新启动django应用程序的方法,但是请注意,应该添加一些后门以供离开。

从理论上讲,您可以使用try..except..块包装每行,这就像重新启动每行,不会像重新启动整个脚本那样可见。 如果有人找到真正可行的解决方案,我将是第一个支持他的人。

您可以将所有内部if (__name__ == '__main__'):main函数,并留下如下内容:

def main():
    #all the code...

if (__name__ == '__main__'):
    while True:
        try:
            main()
        except KeyboardInterrupt:
            pass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM