Me doy cuenta de que "rápido" es un poco subjetivo, así que lo explicaré con cierto contexto. Estoy trabajando en un módulo de Python llamado psutil para leer la información del proceso de forma multiplataforma. Una de las funciones es una función pid_exists(pid)
para determinar si un PID se encuentra en la lista de procesos actual.¿Forma rápida de determinar si existe un PID en (Windows)?
Ahora estoy haciendo esto de la manera obvia, usando EnumProcesses() para extraer la lista de procesos, luego interar a través de la lista y buscar el PID. Sin embargo, algunos benchmarking simples muestran que esto es dramáticamente más lento que la función pid_exists en plataformas basadas en UNIX (Linux, OS X, FreeBSD) donde estamos usando kill(pid, 0)
con una señal 0 para determinar si existe un PID. Pruebas adicionales muestran que EnumProcesses está tomando casi todo el tiempo.
¿Alguien sabe una manera más rápida que usar EnumProcesses para determinar si existe un PID? Intenté OpenProcess() y comprobé un error al abrir el proceso inexistente, pero resultó ser 4 veces más lento que iterar a través de la lista EnumProcesses, por lo que también está fuera. ¿Alguna otra (mejor) sugerencia?
NOTA: Esta es una biblioteca de Python destinada a evitar dependencias lib de terceros como las extensiones pywin32. Necesito una solución que sea más rápida que nuestro código actual, y que no dependa de pywin32 u otros módulos que no estén presentes en una distribución estándar de Python.
EDIT: Para aclarar, somos conscientes de que existen condiciones de carrera inherentes a la información del proceso de lectura. Planteamos excepciones si el proceso desaparece durante el proceso de recopilación de datos o si nos topamos con otros problemas. La función pid_exists() no está pensada para reemplazar el manejo correcto de errores.
ACTUALIZACIÓN: Al parecer mis puntos de referencia anteriores eran defectuosos - Me escribió algunas aplicaciones simples de prueba en C y EnumProcesses constantemente sale más lento y OpenProcess (en conjunción con GetProcessExitCode en caso de que el PID es válido, pero el proceso se ha detenido) es en realidad mucho más rápido no más lento.
Resulta que a pesar de mis pruebas anteriores esta es la mejor manera de hacerlo después de todo. Ver mi respuesta para más detalles si está interesado. – Jay