0

起動時に特別なデータ構造をロードし、その後定期的にロードするワーカー プロセスがあります。

ただし、データ構造 (サード パーティの C++ モジュール) にはメモリ リークがあります。

ガンコーンの「max_requests」設定を使用して、非常に多くのリクエストの後にワーカーを期限切れにすることを試みました。これにより、ワーカーのリソースがクリアされ、データ構造がリロードされます。しかし、私が立ち入らないいくつかの厄介な問題がありました。

os._exit(0) を追加して、ワーカーを強制的に停止 (およびリロード) しようとしましたが、これは、要求がエラー応答を受け取ったことを意味します。

私がやりたいことは、「max_requests」フラグがトリガーされたかのように、gunicorn に応答を送信してからワーカーを殺すように通知することです。

それを行うメカニズムはありますか?

4

1 に答える 1

0

reload 組み込み関数はモジュールの再初期化に役立ちますが、その関数のドキュメント ( http://docs.python.org/2/library/functions.html#reload ) には次のように記載されています: " sys, mainおよびbuiltinを除いて, 組み込みまたは動的にロードされたモジュールをリロードすることは合法ですが, 一般的にはあまり有用ではありません. しかし, 多くの場合, 拡張モジュールは複数回初期化されるように設計されておらず, 任意の方法で失敗する可能性があります.リロードすると。」言い換えれば、それはあなたのケースの問題を解決しないかもしれません.

ただし、サードパーティ モジュールへの呼び出しをサブプロセスに移動できる場合は、別のプロセスでスクリプトを実行してモジュールを使用しているため、毎回リロードするのは簡単です。do_something.py などの別個の py ファイルを作成するだけで、サブプロセスで必要なすべての処理を実行できます。次に、次を使用してこのファイルを実行できます。

p = subprocess.Popen(
        [sys.executable, 'do_something.py', arg1, arg2 ...], 
        stdout=subprocess.PIPE
)

ここで、「arg1、arg2、...」は、サブプロセスに渡す必要がある可能性のある引数を表します。C++ モジュールからの出力を読み取る必要がある場合は、それを do_something.py に出力し、次を使用してアプリケーションで読み取ることができます。

p.stdout.read()

これが特にスムーズな解決策ではないことは認めますが、うまくいくはずだと思います。

于 2013-05-07T21:05:06.723 に答える