我一直在搞Django項目。 我想實現的是Django項目在另一個進程中啓動,而父進程啓動了我寫的任意代碼(我的項目的後端)。顯然,Django進程和父進程進行通信。我希望流程能夠讀取和寫入字典。如何防止進程終止在KeyboardInterrupt上?
我有下面的代碼,從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時管理器進程是否已終止?如果是這樣,是否有阻止它在那裏終止並終止於主流程?
我希望這是有道理的。 任何幫助大大receeved。
這聽起來像一個壞主意一般。它只適用於內置的開發服務器,它不適合在生產環境中運行。 –
正開始這麼想。可能需要找出另一種方法來實現這一點。 –