2011-08-11 3 views
2

私は、要求を受け取ったときにバックグラウンドで長時間実行するスクリプトを実行したいと考えています。私はsubprocessについて読んでいますが、要求が時間通りに完了できるように、呼び出しが非ブロックであることが必要です。django:os.forkを使ってバックグラウンドプロセスを作成しますか?

def controlCrawlers(request): 

    if request.method == 'POST' and 'type' in request.POST and 'cc' in request.POST: 

     if request.POST['type'] == '3': 
      if request.POST['cc'] == '1': 
        try: #temp solution checking socket is occupied by trying to connect 
         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
         s.connect(('localhost',DISCOVERY_SOCKET)) 
         s.close() 

         return HttpResponse(simplejson.dumps({'success':0,'message': 'Socket is occupied. Possible crawler is already running'}), \ 
             mimetype='application/json') 
        except: 
         pid = os.fork() 

         if pid == 0: 
          #f = open('/home/foo/django','a') 
          #f.write('abc') 
          # f.close() 
          path = os.path.join(os.path.dirname(__file__), 'blogcontentReader/blogpost_crawler.py') 
          os.system("python %s" %path) 
          os._exit(0) 

         return HttpResponse(simplejson.dumps({'success':1,'message': 'Running...'}), \ 
            mimetype='application/json') 

私は別のpostから提案されているようos.forkを使用どうやら私のif pid == 0部分に流入しない制御します。これを行う正しい方法ですか?

+0

if request.method == 'POST'とrequest.POST.get( 'type')== '3'とrequest.POST.get( 'cc ')==' 1 ': 'とあなた自身の2つのインデントレベルを保存します。また、 'try'で返ってきたので、' except:pass'を実行して、インデントレベルからその項目を移動してください。それはすべてを読みやすくします。 – agf

+0

なぜ 'subprocess.Popen'が動作しないのか分かりません。執行が中断されることはありませんか? – agf

+0

@agf、確かに、私のポストのリンクから見ると、子プロセスの実行が完了するまでブロックされます。 – goh

答えて

4

ええと、これをしないでください。celeryを代わりに使用してください。これにより、非同期タスクの実行がずっと簡単になり、信頼性が向上します。

+1

セロリーはちょうど1つのスクリプトを実行するための残虐行為のようです。 – goh

+1

@amateurおそらく別のプロジェクトで再びそれを使用したいので、あなたはいつも良い学習課題と考えることができますか? –

+0

あなたはおそらく正しいですね。私はセロリを拾うことを検討すべきです。 – goh

1

セロリのようなもので非同期のタスクキューを使用したくない場合は、常にcron経由でpythonスクリプトを実行できます。これを行うにはいくつかのオプションがあります。例:

  • がタスクをexecuteeとデータベースエントリ
  • を削除し、モデルから値を取得するスタンドアローンのpython /ジャンゴのスクリプトを記述し、あなたのプロセスで必要とされている値を保存したモデルを作成します
  • あなたのスクリプトを実行するためにcronjobを設定してください
関連する問題