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