Tôi nhận ra "nhanh" hơi chủ quan nên tôi sẽ giải thích với một số ngữ cảnh. Tôi đang làm việc trên một mô-đun Python gọi là psutil để đọc thông tin về quy trình theo cách đa nền tảng. Một trong các hàm là hàm pid_exists(pid)
để xác định xem PID có nằm trong danh sách quy trình hiện tại hay không.Cách nhanh chóng để xác định xem một PID có tồn tại trên (Windows) không?
Ngay bây giờ tôi đang làm điều này một cách rõ ràng, sử dụng EnumProcesses() để kéo danh sách quy trình, sau đó liên kết thông qua danh sách và tìm kiếm PID. Tuy nhiên, một số điểm chuẩn đơn giản cho thấy điều này chậm hơn đáng kể so với chức năng pid_exists trên nền tảng UNIX (Linux, OS X, FreeBSD), nơi chúng tôi đang sử dụng kill(pid, 0)
với tín hiệu 0 để xác định xem có tồn tại PID hay không. Thử nghiệm bổ sung cho thấy đó là EnumProcesses chiếm hầu hết thời gian.
Bất cứ ai biết cách nhanh hơn sử dụng EnumProcesses để xác định xem có tồn tại PID không? Tôi đã thử OpenProcess() và kiểm tra lỗi khi mở quá trình không tồn tại, nhưng điều này hóa ra là chậm hơn 4 lần so với lặp qua danh sách EnumProcesses, vì vậy điều đó cũng tốt. Bất kỳ đề xuất nào khác (tốt hơn)?
LƯU Ý: Đây là thư viện Python nhằm tránh các phụ thuộc lib của bên thứ ba như phần mở rộng pywin32. Tôi cần một giải pháp nhanh hơn mã hiện tại của chúng tôi và điều đó không phụ thuộc vào pywin32 hoặc các mô-đun khác không có trong bản phân phối Python chuẩn.
EDIT: Để làm rõ - chúng tôi biết rõ rằng có các điều kiện chủng tộc vốn có trong quá trình đọc iformation. Chúng tôi nêu ra các ngoại lệ nếu quá trình này biến mất trong quá trình thu thập dữ liệu hoặc chúng tôi gặp phải các vấn đề khác. Hàm pid_exists() không có ý định thay thế xử lý lỗi thích hợp.
CẬP NHẬT: Rõ ràng các tiêu chuẩn trước đó của tôi đã bị biến dị - tôi đã viết một số ứng dụng đơn giản kiểm tra trong C và EnumProcesses liên tục đi ra chậm hơn và OpenProcess (kết hợp với GetProcessExitCode trong trường hợp PID là hợp lệ nhưng quá trình này đã ngừng) là thực sự nhiều hơn nhanh hơn không chậm hơn.
Hóa ra mặc dù thử nghiệm trước đó của tôi, đây là cách tốt nhất để đi sau khi tất cả. Xem câu trả lời của tôi để biết chi tiết nếu quan tâm. – Jay