1

django でバックグラウンド プロセスを生成する必要があります。ビューはすぐに戻り、バックグラウンド プロセスは引き続きいくつかの変更を加えてから、データベースを更新します。これはos.spawnl()、別の .py ファイルを呼び出す関数によって行われます。

問題は、バックグラウンド処理が完了した後、ゾンビ関数になること[python] <defunct>です。

どうすればそれを回避できますか? thisthisの例に従いましたが、django レンダリング プロセスの後で子プロセスをゾンビとして取得しました。

この機会に *nix プロセス管理スキルを練習したいので、お願いします。Celery やその他の mq/async タスク ソリューションを提供しないでください。

4

2 に答える 2

2

これはコメントが長くなりました-

waitsyscall (ラッパー) は、os.waitデッド プロセスから終了コード/pid を取得します。os.waitゾンビ プロセスよりも 1 世代上のプロセスを使用する必要があります。ゾンビプロセスの親。親プロセスはSIGCHLD、子プロセスの 1 つが終了するとシグナルを受け取ります。このすべてを自分で行うことに固執する場合はSIGCHLD、シグナル ハンドラー呼び出しでトラップするためのシグナル ハンドラーをインストールする必要がありますos.wait。Unix プロセス処理に関するドキュメントと、モジュールに関する Python ドキュメントを読んでください。非ブロッキングosの関数のバリエーションがあり、役立つ可能性があります。os.wait

import signal
signal.signal(signal.SIGCHLD, lambda _x,_y: os.wait())
于 2012-11-08T13:55:48.757 に答える
1

同様の問題がありました。multiprocessing モジュールの active_children() を使用しました。

import multiprocessing

# somewhere in middleware or where appropriate call
active_children()
于 2015-04-15T23:19:35.620 に答える