「速い」は少し主観的であることを認識しているので、いくつかのコンテキストで説明します。私は、クロスプラットフォームの方法でプロセス情報を読み取るためのpsutilという Python モジュールに取り組んでいます。関数の 1 つはpid_exists(pid)、PID が現在のプロセス リストにあるかどうかを判断するための関数です。
現在、私はEnumProcesses()を使用してプロセス リストを取得し、リストを操作して PID を探しているという明白な方法でこれを行っています。kill(pid, 0)ただし、いくつかの単純なベンチマークでは、PID が存在するかどうかを判断するために 0 シグナルを使用している UNIX ベースのプラットフォーム (Linux、OS X、FreeBSD) の pid_exists 関数よりも大幅に遅いことが示されています。追加のテストでは、ほとんどの時間を占めているのは EnumProcesses であることが示されています。
EnumProcesses を使用して PID が存在するかどうかを判断するよりも速い方法を知っている人はいますか? OpenProcess()を試して、存在しないプロセスを開くエラーをチェックしましたが、これは EnumProcesses リストを反復するよりも 4 倍以上遅いことが判明したので、それも同様です。他の(より良い)提案はありますか?
注: これは、pywin32 拡張機能などのサードパーティの lib 依存関係を回避することを目的とした Python ライブラリです。現在のコードよりも高速で、標準の Python ディストリビューションにない pywin32 やその他のモジュールに依存しないソリューションが必要です。
編集: 明確にするために、プロセス情報の読み取りに固有の競合状態があることをよく認識しています。データ収集中にプロセスが停止した場合、または他の問題が発生した場合は、例外を発生させます。pid_exists() 関数は、適切なエラー処理を置き換えることを意図していません。
更新: どうやら私の以前のベンチマークには欠陥があったようです - C でいくつかの簡単なテスト アプリを書きました。