6

別のマシン (既知の IP を持つ) がスプレッドシートを Web サーバーにアップロードできる django Web サーバーを開発しています。スプレッドシートが更新された後、スプレッドシートでいくつかの処理/検証/分析をトリガーし (5 分以上かかる場合があります --- 他のサーバーが応答を合理的に待つには長すぎます)、他のマシンを送信します (データ処理が終了したことを示す HttpResponse。

processing.data()を返した後はできないことはわかっていますがHttpResponse、機能的には次のようなコードが必要です。

# processing.py
def spreadsheet(*args, **kwargs):
    print "[robot voice] processing spreadsheet........."
    views.finished_processing_spreadsheet()

# views.py
def upload_spreadsheet(request):
    print "save the spreadsheet somewhere"
    return HttpResponse("started processing spreadsheet")
    processing.data()

def finished_processing_spreadsheet():
    print "send good news to other server (with known IP)"

各関数を個別に記述する方法は知っていますが、応答が返されたprocessing.data() 後に効果的に呼び出すにはどうすればよいでしょうか? views.upload_spreadsheet

django のrequest_finishedシグナリング フレームワークを使用してみましたが、これはprocessing.spreadsheet()を返した後にメソッドを トリガーしませんHttpResponseviews.upload_spreadsheet同じ問題でデコレータを使用してみました。

これは、ミドルウェアまたはカスタムのクラスベースのビューを作成することと関係があるのではないかと考えていますが、どちらも経験がないので、助けを求めて宇宙に質問を投げかけようと思いました。

ご協力いただきありがとうございます!

4

2 に答える 2

5

実際、Django には同期モデルがあります。実際の非同期処理を行いたい場合は、メッセージ キューが必要です。django で最もよく使用されるのは celery です。少し「やり過ぎ」に見えるかもしれませんが、これは良い答えです。

なぜ私たちはこれが必要なのですか?wsgi アプリでは、apache が実行可能ファイルにリクエストを送信し、実行可能ファイルがテキストを返すためです。Apache が要求の終了を認識するのは、実行可能ファイルが実行を終了したときだけです。

于 2012-02-29T08:51:41.090 に答える
3

実装の問題は、処理中のスプレッドシートの数がワーカーの数と等しい場合、Web サイトが応答しなくなることです。

バックグラウンド タスク キューを使用する必要があります。基本的には、サーバーとバックグラウンド タスク マネージャーの 2 つのプロセスがあります。サーバーは、スプレッドシートの処理をバックグラウンド タスク マネージャーに委任する必要があります。バックグラウンド タスクが完了すると、何らかの方法でサーバーに通知する必要があります。たとえば、model_with_spreadsheet.processed = datetime.datetime.now() を実行できます。

django-ztask (非常に簡単なセットアップ)、セロリ(非常に強力で、あなたのケースではおそらくやり過ぎ)、さらにはuwsgi スプーラー(明らかに uwsgi デプロイメントが必要です)などのバックグラウンド ジョブ マネージャーを使用する必要があります。

于 2012-02-29T08:47:45.853 に答える