Ich realisiere "schnell" ist ein bisschen subjektiv, also werde ich mit etwas Kontext erklären. Ich arbeite an einem Python-Modul namens psutil zum Lesen von Prozessinformationen auf einer plattformübergreifenden Art und Weise. Eine der Funktionen ist eine pid_exists(pid)
-Funktion zum Bestimmen, ob eine PID in der aktuellen Prozessliste enthalten ist.Schnelle Möglichkeit zu bestimmen, ob eine PID (Windows) existiert?
Im Moment mache ich dies die offensichtliche Art und Weise, EnumProcesses() zu verwenden, um die Prozessliste zu ziehen, dann durch die Liste zu interagieren und nach der PID zu suchen. Einige einfache Benchmarks zeigen jedoch, dass dies auf UNIX-basierten Plattformen (Linux, OS X, FreeBSD) wesentlich langsamer ist als die pid_exists-Funktion, bei der wir kill(pid, 0)
mit einem 0-Signal verwenden, um festzustellen, ob eine PID existiert. Zusätzliche Tests zeigen, dass EnumProcesses fast die ganze Zeit in Anspruch nimmt.
Wer weiß einen schnelleren Weg als mit EnumProcesses zu bestimmen, ob eine PID existiert? Ich versuchte OpenProcess() und prüfte auf einen Fehler, der den nicht vorhandenen Prozess öffnete, aber dieses stellte heraus, um über 4x langsamer zu sein als das Durchlaufen der EnumProcesses Liste, also ist es auch heraus. Irgendwelche anderen (besseren) Vorschläge?
HINWEIS: Dies ist eine Python-Bibliothek, die lib-Abhängigkeiten von Drittanbietern wie pywin32-Erweiterungen vermeiden soll. Ich brauche eine Lösung, die schneller ist als unser aktueller Code, und das hängt nicht von pywin32 oder anderen Modulen ab, die in einer Standard-Python-Distribution nicht vorhanden sind.
BEARBEITEN: Um zu verdeutlichen - wir sind uns bewusst, dass es bei der Leseprozessanalyse Race Conditions gibt. Wir erheben Ausnahmen, wenn der Prozess im Laufe der Datenerfassung aufhört oder wir auf andere Probleme stoßen. Die Funktion pid_exists() soll die ordnungsgemäße Fehlerbehandlung nicht ersetzen.
UPDATE: Offenbar war mein früherer Benchmarks fehlerhaft - eigentlich schrieb ich ein paar einfachen Test Apps in C und EnumProcesses kommt konsequent aus langsamer und Open (in Verbindung mit GetProcessExitCode falls die PID gültig ist, aber der Prozess gestoppt wird) ist viel schneller nicht langsamer.
Stellt sich heraus, trotz meiner früheren Tests ist dies der bessere Weg, um schließlich zu gehen. Siehe meine Antwort für Details, wenn Sie interessiert sind. – Jay