我一直在搞乱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进程?如果是的话,无论如何都要阻止它终止并终止主进程吗?
我希望这是有道理的。 任何帮助都很受欢迎。
答案 0 :(得分:-1)
好的,到目前为止,我认为不可能简单地忽略异常。当你上升一个时,你总是直接进入“除外”区块(如果有的话)。我在这里建议的是什么会在每个^ C重新启动你的django应用程序,但请注意,应该添加一些后门离开。
理论上,你可以使用try..except..
块来包装每一行,这就像重新启动每一行一样,不会像重启整个脚本那样可见。如果有人找到一个真正有效的解决方案,我将是第一个向他投票的人。
您可以将if (__name__ == '__main__'):
内的所有内容设置为o main
功能,并保留以下内容:
def main():
#all the code...
if (__name__ == '__main__'):
while True:
try:
main()
except KeyboardInterrupt:
pass