![](/img/trans.png)
[英]How to prevent a block of code from being interrupted by KeyboardInterrupt in Python?
[英]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.