2011-06-28 7 views
5

私は、関数を非同期に呼び出すためにdjutils@asyncデコレータを使用します。これは標準の./manage.py runserverコマンドでサーバを起動するとうまく動作します。しかし、私がgunicornの下で私のdjangoアプリケーションを実行し、@ asyncデコレータの関数を呼び出すときには何も起こりません...Django-utils @asyncデコレータとガンコンが動作しない

私はdjutils非同期デコレータのコードを調べて、Python標準また、キューを消費するために1つまたは複数のスレッドを生成します。

誰でも、私が次に見なければならないアイデアやヒント、ガンコーンで実行している@async関数を取得するには? gunicornnはPythonスレッド実装の標準実装を変更していますか?

答えて

1

Pythonスレッドはグローバルインタープリタロックの影響を受けやすく、Gunicornはおそらくデフォルトのスレッド動作をサルパッチする可能性があります。だからあなたはそのワーカータイプを変更しようとすることができます。あなたのGunicornがGeventで非同期作業者を使用するように設定されている場合、Geventはこれを行うことができますので、Monkey patch Threadを使用してスレッド・クラスを協調的な "緑の"スレッドに置き換えます。

個人的に私は「違うやり方で」答えることを嫌い、それを与えるのは申し訳ありません。 Webサーバーのプロセス内からスレッドまたはforkプロセスを生成しないでください。その作業をバックグラウンドキューにオフロードするだけです。

単純なニーズがある場合は、独自のバックグラウンドキューを構築するのは簡単です。 5分ごとに実行され、そこから作業するcronスクリプトと組み合わせて、保留中のジョブと完了したジョブをログに記録するテーブルをデータベースに作成します。

安定していて、拡大縮小が可能な場合は、Celeryはかなり良いです。

0

キュー内のアイテムを処理するスレッドを起動するコードは、gunicornが最初に起動するときに呼び出されます。つまり、マスターgunicornプロセスで呼び出されたときに呼び出されます。しかし、gunicornは複数のワーカープロセスをフォークします。その際、スレッドを開始するコードは再呼び出しされません。したがって、これらのバックグラウンドスレッドは、マスターガンコーンプロセスにのみ存在し、ガンコーンワーカープロセスには存在しません。

関連する問題