2011-08-03 34 views
2

私はDjangoプロジェクトを使いこなしてきました。 私が達成したいのは、親プロセスが私が書いた任意のコード(私のプロジェクトのバックエンド)の読み込みを開始する間に、Djangoプロジェクトが別のプロセスで起動することです。明らかに、Djangoプロセスと親プロセスが通信します。私は、プロセスによって読み込まれて書かれた辞書を希望します。KeyboardInterruptでプロセスが終了しないようにするには?

私はhereからの例に基づいて以下のコードを、持っている:私はDjangoのプロセスを殺すために、Ctrl + Cを押すと

#!/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) 

を、私は、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

これは、一般的には悪いアイデアのように聞こえます。本番環境での実行には適していない組み込みの開発サーバーでのみ機能します。 –

+0

それを考え始めました。おそらく、これを達成する別の方法を見つけなければならないでしょう。 –

答えて

-1

これまでのところ、例外を無視することはできません。あなたが1つを上げるとき、あなたは常に "except"ブロックに入る。私がここに提案しているのは、それぞれのCでdjangoアプリケーションを再起動するものですが、残すためにバックドアを追加する必要があることに注意してください。

理論上は、各行をtry..except..ブロックでラップすることができます。これは、各行の再起動のように動作します。スクリプト全体の再起動時には表示されません。誰かが本当に実用的な解決策を見つけた場合、私は彼にアップルボートする最初のものになるでしょう。

あなたはO main機能にあなたのif (__name__ == '__main__'):内のすべての設定と、このような何かを残すことができますが:

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

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

if文を含む括弧は役に立たない。コードはどちらの助けにもなりません:あなたは割り込みを捕まえますが、プログラムは「自然に」終了します。 –

関連する問題