PHP işçilerden Python dişlerine

3 Cevap php

Şu anda bireysel işçiler (süreçler) onların yükünü (iş) almak için bekleyen makine başına (CLI modunda) 50 PHP koşuyorum. Örneğin, bir görüntüyü yeniden boyutlandırma işi. Iş yükü onlar görüntü (binary data) ve istediğiniz boyutu alırsınız. Işçisi bir iş ve boyutlandırılan görüntüyü geri döner gelmez. Sonra (o akıllı bir şekilde döngüler) daha fazla iş bekler. Ben aynı yürütülebilir, kütüphaneler ve sınıfları yüklenir ve 50 kez örneği olduğunu küstah değilim. Ben düzeltmek muyum? Bu çok etkili gelmiyor çünkü.

Ben şimdi ne var istiyorum tüm bu iş kolları ve her şey (daha verimli olması için) sadece bir kere yüklenir yerken tüm CPU çekirdeği kullanmak için güçlü olmak bir süreçtir. Ben yeni bir iş parçacığı her iş için başlamış olacak ve tamamlandıktan sonra, iplik durdurmak olacaktır sanırım. Işi az 50 konu varsa daha fazla işler kabul edilecektir. 50 konuları meşgul iseniz, hiçbir ek iş kabul edilir.

Ben sistem kullanır ve Python hemen hemen hepsi için desteği vardır PHP dışında tek dil olan tüm çeşitli bileşenlerine erişmek için (Memcached, Redis, MogileFS, ... için) kütüphaneler bir çok kullanıyorum.

Python ne istediğinizi yapabilir ve daha hızlı ve daha verimli geçerli PHP çözüm olacak?

3 Cevap

Büyük bir olasılıkla - evet. Ama çoklu yapmak zorunda düşünmeyin. Çoklu modül bakabilirsiniz. Zaten sen kullanabilirsiniz ne dahil bir Havuzuna, bir uygulama vardır. Ve bu temelde Gil sorunu (- bu çok basitleştirilmiş bir açıklama çoklu herhangi bir zamanda sadece 1 "standart python kodu" çalıştırabilirsiniz) çözer.

Hala iş başına bir süreç çatal, ama farklı bir şekilde tekrar tekrar tüm başlangıç ​​daha olacaktır. Tüm alıştırmalarını yapmış ve işçi sürecine girmeden önce yüklenen kütüphaneler copy-on-write şekilde miras olacaktır. Sen gereğinden fazla alıştırmalarını yapmayacağım ve aslında pre-havuz durumundan farklı vermedi eğer aynı libarary / sınıf için bellek israf olmaz.

Yani evet - sadece bu kısmına bakarak, piton az kaynak israf olacak ve "güzel" bir işçi-havuz modelini kullanacak. Gerçekten hızlı / daha az CPU-Abusing olacak olsun, testi olmadan söylemek zor, ya da en azından koduna bakarak. Kendiniz deneyin.

Eklendi: Bellek kullanımı konusunda endişeli iseniz, piton da php GC bir değil bir öncelik olup iyi (ve iyi bir neden için çok) ise, bu "doğru" bir çöp toplayıcı vardır beri, size biraz yardımcı olabilir .

Linux has shared libraries, so those 50 php processes use mostly the same libraries. You don't sound like you even have a problem at all.

Bu kelimeler kendi başına bir sorun, eğer bir şey "this does not sound very effective.", bir sorun açıklama değildir. Kod yazma başka sadece zaman ve / veya para harcıyorsun, bir real reason ihtiyacı vardır.

Python güzel bir dildir ve php daha kötü gerçekleştirmez. Python multiprocessing modülü muhtemelen çok çok yardımcı olacaktır. Ama php uygulama tamamen deli değilse kazanmak için pek bir şey yok. Her şey çalışıyor Peki neden bile üzerinde vakit rahatsız? Bu genellikle amaç değil, yeniden yazmak için bir neden ...

Eğer aklı başında bir işletim sistemi üzerinde ise daha sonra paylaşılan kütüphaneleri sadece bir kez yüklenir ve bunları kullanarak tüm süreçler arasında ortak olmalıdır. Veri yapıları ve bağlantı kolları için hafıza besbelli çoğaltılamaz, ancak sistemlerini durdurma ve başlangıç ​​havai boşta iken şeyler uydurarak daha büyük olabilir. Eğer Gearman gibi bir şey kullanıyorsanız, birkaç işçi bile kadar kalmak izin mantıklı olabilir boşta ve tüm mevcut işçiler gibi mevcut CPU sayısı olarak bir eşik kadar meşgul ise o zaman yeni işçi başlayacak kalıcı bir izleme süreci var . Onlar bir süre için boşta sonra bu süreç daha sonra LIFO şekilde işçileri öldürebilir.