gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:17 26 4
gpt4 key购买 nike

我一直在搞一个 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

关于python - 如何防止进程在 KeyboardInterrupt 上终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com