2011-08-03 53 views
2

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

+0

這聽起來像一個壞主意一般。它只適用於內置的開發服務器,它不適合在生產環境中運行。 –

+0

正開始這麼想。可能需要找出另一種方法來實現這一點。 –

回答

-1

好吧,據我所知,沒有可能簡單地忽略異常。當你上升時,如果有的話,你總是直接進入「除了」區塊。我在這裏提出的是什麼會在每個^ C上重新啓動你的d​​jango應用程序,但是請注意,應該爲離開添加一些後門。

從理論上講,你可以用try..except..塊包裝每一行,這就像每一行重新啓動一樣,不會像重新啓動整個腳本那樣可見。如果有人找到一個真正有效的解決方案,我會成爲第一個贊成他的人。

您可以設置所有的if (__name__ == '__main__'):內轉換爲o main功能,並留下這樣的:

def main(): 
    #all the code... 

if (__name__ == '__main__'): 
    while True: 
     try: 
      main() 
     except KeyboardInterrupt: 
      pass 
+1

與if語句的parens是無用的。代碼也不會幫助你:捕獲中斷,但程序自然終止。 –