5

この問題は、他の質問の 1 つに対するこの回答に関連しています。この回答でos.kill(pid, 0)、サブプロセスが終了したかどうかを確認するために使用できると言われました。まだ実行中の場合は、Noneが返されます。終了した場合は、 anOSErrorが発生します。これで今のところ問題なく動作していますが、サブプロセスが終了しているにもかかわらず、os.kill(pid, 0)まだ戻ってくる状況に陥っNoneています。プロセス ID は 82430 で、OSX のアクティビティ モニターで、この ID を持つプロセスが見つかりません。ただし、Python シェルを開いて と入力するos.kill(82430, 0)と、引き続き が返されますNone。わかりません。

正確には、上記のように、Ajax GET リクエストを介して Django ビューでサブプロセスのステータスを定期的にチェックします。

サーバー側の Django ビュー

def monitor_process(request):
    response_data = {}

    try:
        os.kill(int(request.GET['process_id']), 0)
        response_data['process_status'] = 'running'
    except OSError:
        response_data['process_status'] = 'finished'

    return HttpResponse(json.dumps(response_data), mimetype='application/json')

クライアント側での Ajax 呼び出し

var monitorProcess = function(processId) {

    $.ajax({
        dataType: 'json',
        type: 'GET',
        url: '/monitor_process/',
        data: {'process_id': processId},
        success: function(response) {

            if (response.process_status == 'running') {
                // Only this branch is always executed

                // ...
            }

            else if (response.process_status == 'finished') {
                // This branch never gets executed

                // Stop checking for process status
                // The periodic check was started by 
                // window.setInterval in a different Ajax call
                clearInterval(monitorProcessId);

                // ...

            }
        }
    });
}; 

プロセスはある時点で停止し、アクティビティ モニターで消えますが、os.kill()どうやらそれを認識していません。これはなぜですか?どうもありがとうございました!

4

1 に答える 1

4

それはpythonではなく、プロセス自体に関するものです。実行中の各プロセスは、異なるPIDでいくつかのスレッドを生成する場合があります。親が適切に殺されない場合、それらはそこにとどまります (「ゾンビ スレッド」)。それらは、同じ ID の下で親と一緒にグループ化されます。そのため、Python では次のように使用できます。

os.killpg(pgid, sig) 

グループ全員を殺すために。以下で確認できます

/proc/<PID>/task/ 

(実際のプロセスIDはどこにありますか)生成されたスレッドの

于 2012-11-27T23:37:41.963 に答える