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