Я понимаю, что "быстрый" немного субъективен, поэтому я объясню с некоторым контекстом. Я работаю над модулем Python под названием psutil для чтения информации о процессах в кросс-платформенной форме. Одной из функций является pid_exists(pid)
функция для определения наличия PID в текущем списке процессов.
Прямо сейчас я делаю это очевидным способом, используя EnumProcesses () , чтобы вытащить список процессов, затем просматривая список и ища PID. Однако некоторые простые тесты показывают, что это значительно медленнее, чем функция pid_exists на платформах на основе UNIX (Linux, OS X, FreeBSD), где мы используем kill(pid, 0)
с сигналом 0, чтобы определить, существует ли PID. Дополнительное тестирование показывает, что это EnumProcesses, которые занимают почти все время.
Кто-нибудь знает более быстрый способ, чем использование EnumProcesses, чтобы определить, существует ли PID? Я попытался OpenProcess () и проверил, нет ли ошибки при открытии несуществующего процесса, но это оказалось более чем в 4 раза медленнее, чем итерация по списку EnumProcesses, так что это тоже не так. Любые другие (лучшие) предложения?
ПРИМЕЧАНИЕ : Это библиотека Python, предназначенная для избежания сторонних зависимостей lib, таких как расширения pywin32. Мне нужно решение, которое работает быстрее нашего текущего кода и не зависит от pywin32 или других модулей, отсутствующих в стандартном дистрибутиве Python.
РЕДАКТИРОВАТЬ : Чтобы уточнить - мы хорошо понимаем, что существуют гоночные условия, присущие информации процесса чтения. Мы выдвигаем исключения, если процесс прекращается во время сбора данных или у нас возникают другие проблемы. Функция pid_exists () не предназначена для замены правильной обработки ошибок.
ОБНОВЛЕНИЕ : По-видимому, мои предыдущие тесты были ошибочными - я написал несколько простых тестовых приложений на C, и EnumProcesses последовательно выходили медленнее и OpenProcess (в сочетании с GetProcessExitCode в случае, если PID действителен, но процесс остановлен ) на самом деле намного быстрее не медленнее.