Ana Sayfa

Python'da İşlem Bekleme Mekanizmasında 15 Yıllık Polling Dönemi Sona Erdi

1 dk okuma

Python'ın standart subprocess modülü ve psutil kütüphanesi, bir sürecin sonlanmasını beklerken yaklaşık 15 yıldır "busy-loop polling" adı verilen verimsiz bir yöntem kullanıyordu. Bu yaklaşım, Popen.wait() fonksiyonuna timeout parametresi eklendiğinden beri, süreci sonlanıp sonlanmadığını sürekli olarak kontrol etmek için waitpid(WNOHANG) çağrılarını ve kısa uyku sürelerini içeren bir döngüye dayanıyordu. Bu yöntem, işlem durumunu kontrol etmek için sistemin sürekli uyanmasına neden olarak CPU döngülerini israf ediyor, pil ömrünü kısaltıyor ve süreç sonlanması ile bunun algılanması arasında gecikmelere yol açıyordu. Özellikle birden fazla süreci aynı anda izlerken bu sorunlar daha da büyüyordu.

Makale, bu uzun süreli verimsizliğin nasıl giderildiğini açıklıyor. Çözüm, POSIX sistemlerinin dosya tanımlayıcıları hazır olduğunda bildirim almak için kullandığı select(), poll(), epoll() (Linux) ve kqueue() (BSD/macOS) gibi sistem çağrılarını süreç PID'leri için kullanmaya dayanıyor. Özellikle Linux'ta, 2019'da tanıtılan pidfd_open() sistem çağrısı, bir süreç PID'ine referans veren bir dosya tanımlayıcı döndürüyor. Bu dosya tanımlayıcı, poll() ile birlikte kullanılarak sürecin sonlanması veya zaman aşımına uğraması durumunda çekirdek tarafından doğrudan bildirim alınmasını sağlıyor.

Bu yeni "olay tabanlı bekleme" yaklaşımı, busy-looping'i tamamen ortadan kaldırıyor. Çekirdek, süreç sonlandığında veya zaman aşımı dolduğunda uygulamayı tam olarak uyandırıyor. Yazar, poll()'u select()'e tercih etmesinin nedenini dosya tanımlayıcı limiti (FD_SETSIZE) olarak, epoll()'a tercih etmesinin nedenini ise ek bir dosya tanımlayıcı oluşturma ihtiyacı olmaması ve tek bir FD'yi izlerken daha verimli olması olarak belirtiyor. Bu iyileştirme, önce psutil'de, ardından CPython'ın standart subprocess modülünde uygulandı ve Python'daki süreç yönetimini önemli ölçüde daha verimli hale getirdi.

İçgörü

Python'ın `subprocess` modülündeki 15 yıllık verimsiz busy-loop polling mekanizmasının olay tabanlı sistem çağrılarıyla değiştirilmesi, CPU kullanımını azaltarak ve gecikmeyi düşürerek süreç yönetiminde önemli bir performans artışı sağlıyor.

Kaynak