Mi rendo conto che "veloce" è un po 'soggettivo quindi spiegherò con un certo contesto. Sto lavorando su un modulo Python chiamato psutil per leggere le informazioni sul processo in modo multipiattaforma. Una delle funzioni è una funzione pid_exists(pid)
per determinare se un PID si trova nell'elenco dei processi corrente.Un modo rapido per determinare se esiste una PID (Windows)?
In questo momento sto facendo questo in modo ovvio, utilizzando EnumProcesses() per estrarre l'elenco dei processi, quindi interating nell'elenco e cercando il PID. Tuttavia, alcuni semplici benchmark mostrano che questo è notevolmente più lento della funzione pid_exists su piattaforme basate su UNIX (Linux, OS X, FreeBSD) dove stiamo usando kill(pid, 0)
con un segnale 0 per determinare se esiste un PID. Test aggiuntivi dimostrano che è EnumProcesses che occupa quasi tutto il tempo.
Qualcuno conosce un modo più veloce rispetto all'utilizzo di EnumProcesses per determinare se esiste una PID? Ho provato OpenProcess() e verificato un errore durante l'apertura del processo inesistente, ma si è rivelato essere oltre 4 volte più lento di iterare attraverso l'elenco EnumProcesses, quindi è anche fuori. Qualche altro (migliore) suggerimento?
NOTA: Questa è una libreria Python pensata per evitare dipendenze lib di terze parti come le estensioni pywin32. Ho bisogno di una soluzione che sia più veloce del nostro codice attuale e che non dipenda da pywin32 o altri moduli non presenti in una distribuzione standard di Python.
EDIT: Per chiarire, siamo ben consapevoli del fatto che ci sono condizioni di competizione inerenti alla iformation del processo di lettura. Solleviamo eccezioni se il processo sparisce durante la raccolta dei dati o ci imbattiamo in altri problemi. La funzione pid_exists() non è destinata a sostituire la corretta gestione degli errori.
UPDATE: A quanto pare i miei punti di riferimento precedenti sono state viziate - ho scritto alcune semplici applicazioni di test in C e EnumProcesses costantemente esce più lento e OpenProcess (in collaborazione con GetProcessExitCode nel caso in cui il PID è valido, ma il processo si è fermato) è in realtà molto più veloce non più lento.
Si scopre che nonostante i miei precedenti test questo è il modo migliore di andare dopo tutto. Vedi la mia risposta per i dettagli se interessati. – Jay