如何防止进程终止于KeyboardInterrupt?

时间:2011-08-03 12:07:41

标签: python django multiprocessing

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

我有以下代码,基于here的示例:

#!/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来杀死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进程?如果是的话,无论如何都要阻止它终止并终止主进程吗?

我希望这是有道理的。 任何帮助都很受欢迎。

1 个答案:

答案 0 :(得分:-1)

好的,到目前为止,我认为不可能简单地忽略异常。当你上升一个时,你总是直接进入“除外”区块(如果有的话)。我在这里建议的是什么会在每个^ C重新启动你的d​​jango应用程序,但请注意,应该添加一些后门离开。

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

您可以将if (__name__ == '__main__'):内的所有内容设置为o main功能,并保留以下内容:

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

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