3

アプリが提供するページの 1 つのスナップショットを取得する Django 関数があります。これは、アプリからアプリへの HTTP 接続を開くことによって行われます。

これは現在管理コマンドとして実行されており、正常に動作しています。ただし、モデルに接続されたデータのスナップショットを作成しているため、モデルが保存されたときにこれをトリガーしたいと考えています。モデルのメソッドから関数をトリガーするとsave、リクエストとレスポンスの Django サイクルの途中でビュー コードがリクエストをトリガーし、urllib2不平を言う状況になります。

これは、django dev サーバーにスレッドが 1 つしかないためだと思います。これが原因だとしても、モデルの保存中に 2 つのスレッドを利用できることにアプリを依存させたくありません。コードをサーバーのスレッド化に結び付けたくありません。

モデルが保存され、要求/応答サイクルが終了すると、一部のエージェントが起動して「この関数を実行する必要がある」と言うように、これを非同期で行う必要があると思います。

解決策として考えられるのは、スレッドを作成すること (これは特に良い考えではないと思います) や、Celery を使用すること (私は少量の作業しか行っていないため、やり過ぎかもしれません) です。

シグナル ハンドラーを使用することを考えましたが、シグナル ハンドラーはすべてモデルのメソッドmodel中に同期的に実行され、シグナルにはビューで変更されたモデルが含まれていません。saverequest_finished

管理コマンドを実行する cron ジョブを使用することもできますが、そうすると別の複雑さが生じます。前のジョブがまだ完了していない場合はどうなりますか? それをどのように示し、どのコンテキストでそのセマフォを保存するのですか?

音量は管理画面から行うため、非常に小さくなります。ただし、これは要求/応答中にも実行されるため、管理インターフェイスにフックすることはできません。

私の問題は、この関数を非同期的にトリガーする必要があることだと仮定すると、これを行う最も簡単な方法は何ですか?

4

2 に答える 2

2

私は間違いなくセロリをお勧めします - 本当に良い選択肢はありません. django データベース ブローカーでdjango-celeryを使用すると、非常に軽量で、AMQP サーバーをセットアップする必要がありません。django が使用するのと同じデータベースを使用します。

私はこのセットアップを軽量の非同期ニーズを持つ複数の django プロジェクトに使用しましたが、非常にシンプルで信頼性があります。

upstart を使用している場合に備えて、django-celery ブローカーを自動的に起動する upstart スクリプトの例をここに投稿しました

于 2012-08-21T12:28:25.873 に答える
0

あなたに受け入れられるかどうかはわかりませんが、簡単な方法は、スクリプトとして記述し、django アプリケーションからバックグラウンドで実行することです。

于 2012-08-21T12:40:34.887 に答える