アプリが提供するページの 1 つのスナップショットを取得する Django 関数があります。これは、アプリからアプリへの HTTP 接続を開くことによって行われます。
これは現在管理コマンドとして実行されており、正常に動作しています。ただし、モデルに接続されたデータのスナップショットを作成しているため、モデルが保存されたときにこれをトリガーしたいと考えています。モデルのメソッドから関数をトリガーするとsave
、リクエストとレスポンスの Django サイクルの途中でビュー コードがリクエストをトリガーし、urllib2
不平を言う状況になります。
これは、django dev サーバーにスレッドが 1 つしかないためだと思います。これが原因だとしても、モデルの保存中に 2 つのスレッドを利用できることにアプリを依存させたくありません。コードをサーバーのスレッド化に結び付けたくありません。
モデルが保存され、要求/応答サイクルが終了すると、一部のエージェントが起動して「この関数を実行する必要がある」と言うように、これを非同期で行う必要があると思います。
解決策として考えられるのは、スレッドを作成すること (これは特に良い考えではないと思います) や、Celery を使用すること (私は少量の作業しか行っていないため、やり過ぎかもしれません) です。
シグナル ハンドラーを使用することを考えましたが、シグナル ハンドラーはすべてモデルのメソッドmodel
中に同期的に実行され、シグナルにはビューで変更されたモデルが含まれていません。save
request_finished
管理コマンドを実行する cron ジョブを使用することもできますが、そうすると別の複雑さが生じます。前のジョブがまだ完了していない場合はどうなりますか? それをどのように示し、どのコンテキストでそのセマフォを保存するのですか?
音量は管理画面から行うため、非常に小さくなります。ただし、これは要求/応答中にも実行されるため、管理インターフェイスにフックすることはできません。
私の問題は、この関数を非同期的にトリガーする必要があることだと仮定すると、これを行う最も簡単な方法は何ですか?