Skip to main content
 首页 » 编程设计

python之如何防止进程在 KeyboardInterrupt 上终止

2025年05月04日10sky-heaven

我一直在搞一个 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 进程是否已终止?如果是,是否有办法阻止它在那里终止并终止于主进程?

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

请您参考如下方法:

好的,目前我看不到简单地忽略异常的可能性。当你上升一个时,如果有一个,你总是直接进入一个“除外” block 。我在这里提出的是在每个 ^C 上重新启动你的 django 应用程序的东西,但请注意,应该添加一些后门以供离开。

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

您可以将 if (__name__ == '__main__'): 中的所有内容设置到 o main 函数中,并留下如下内容:

def main(): 
    #all the code... 
 
if (__name__ == '__main__'): 
    while True: 
        try: 
            main() 
        except KeyboardInterrupt: 
            pass