ZeroMQ IPC'ye karşı Queue ile Python Çoklu İşleme


10

Ben kullanarak bir Python uygulama yazma meşgulüm ZeroMQ ve anlatıldığı gibi Majordomo desen varyasyonu uygulayan ZGuide .

Bir grup işçi ve müşteri arasında aracı olarak komisyoncum var. Gelen her istek için kapsamlı bir günlük kaydı yapmak istiyorum, ancak aracının bunu yaparak zaman kaybetmesini istemiyorum. Aracı bu günlük kaydı isteğini başka bir şeye iletmelidir.

İki şekilde düşündüm: -

  1. Yalnızca günlük kaydı için çalışanlar oluşturun ve ZeroMQ IPC aktarımını kullanın
  2. Kuyrukla Çok İşlemcili Kullan

Hangisinin bu konuda daha iyi veya daha hızlı olduğundan emin değilim. İlk seçenek, normal çalışanlar için zaten kullandığım geçerli temel sınıfları kullanmama izin veriyor, ancak ikinci seçenek uygulamak daha hızlı görünüyor.

Yukarıda ya da muhtemelen farklı bir çözüm hakkında bazı tavsiyeler veya yorumlar istiyorum.

Yanıtlar:


4

Jonathan'ın önerdiği gibi standart araçları kullanma yaklaşımını seviyorum. Hangi işletim sistemi üzerinde çalıştığınızı söylemediniz, ancak aynı ruhu izleyen başka bir alternatif, Python'un standart günlük modülünü birlikte kullanmak logging.handlers.SysLogHandlerve günlük iletilerini rsyslog hizmetine (herhangi bir linux / unix'de kullanılabilir) göndermek olabilir , ancak ben bir pencere seçeneği olduğunu düşünüyorum , ama bunu hiç kullanmadım).

Esasen tüm sistem sizin düşündüğünüz şeyi uygular. Yerel işleminiz, başka biri tarafından işlenecek / işlenecek / yazılacak günlük iletisini sıralar. Bu durumda, başkası ( rsyslog) birçok yerleşik işlevsellik ve esnekliğe sahip tanınmış, kanıtlanmış bir hizmettir.

Bu yaklaşımın bir diğer avantajı, ürününüzün syslog üzerine inşa edilmiş diğer sysadmin araçlarıyla çok daha iyi bir şekilde entegre olmasıdır. Ve bu seçeneği elde etmek için herhangi bir kod yazmanızı bile gerektirmez.


1
Tekerleği yeniden icat etmeyi önleyen bir öneri için +1. Bu şekilde tasarlanmış bir sistemi miras almayı düşünmezdim. İşi güzel yapar, ancak gelecekteki değişiklikler için birçok serbestlik derecesi sağlar.
evadeflow

2

Uzaktan günlüğe kaydetme uygulamak için üçüncü bir olasılığı göz önünde bulundurmak isteyebilirsiniz. Standart Python günlükleme modülünü kullanırsanız, logging.QueueHandlersınıfı çalışanlarınızda, istemcilerinizde ve logging.QueueListeneraracınızda ve sınıfı uzaktan günlüğe kaydetme işleminizde kullanmayı düşünebilirsiniz .

Normal Python'u multiprocessing.Queueuygulama işlemleriniz ve günlük oluşturma işleminiz arasında aktarım olarak kullanmak yerine, Queuesınıfınızın standart Python'un yerine geçmesi için ördek tipi ZeroMQ kullanarak kendi değiştirme sınıfınızı uygulayın Queue. Bu şekilde uygulamanız, tek bir çok çekirdekli bilgisayardan dağıtılmış veri merkezlerine kadar herhangi bir ortamda değişmeden çalışabilir.

Özetlemek gerekirse, QueueHandlertüm çalışanlarınızda, müşterilerinizde ve aracılarınızda standart bir Python günlükçüsü kullanın ve günlük kaydının ağır kaldırılması için seçtiğiniz QueueListenerPython loggingişleyicilerini temel alarak bağımsız bir işlem oluşturun .


Python 2.7 kullanıyorum. QueueHandler sınıfı yalnızca Python 3.2 kullanılabilir inanıyorum.
Imraan

Kodu Python 3'ten almak ve doğrudan uygulamanızın bir parçası olarak kullanmak çok kolay olurdu.
Jonathan

Bunu deneyeceğim ve işe
yarayıp yaramadığını

0

Bunlar, her biri kendi artıları ve eksileri olan, büyük olasılıkla daha sonraki bir geliştirme aşamasında pan göreceğiniz radikal olarak farklı yaklaşımlardır:

İki şekilde düşündüm: -

  1. Yalnızca günlük kaydı için çalışanlar oluşturun ve ZeroMQ IPC aktarımını kullanın
  2. Kuyrukla Çok İşlemcili Kullan

Denemenin bir yolu , yaklaşım 1'de olduğu gibi ek bir günlük kaydı çalışanına sahip olmaktır. Çalışanlarınızın bir memcache günlük kümesi kümesine oturum açmasına izin verebilirsiniz ve günlük kaydı çalışanı geçerli kaynak yükünü izler ve belirli bir kaynak yük parametresini aldattıktan sonra, çalışan bir GİB sınırlı aygıtında (ör. sabit disk) oturum açar.

Ayrıca Jonathan'ın çoğunlukla Python 2.x'i kullandığım ve performans zarfını gerçekten zorlamak için kendi günlük arka ucunuzu ayarlamanız gerekeceği konusunda uyarıyı seviyorum.

Yanılıyorsam beni düzeltin, ancak benim görevim, veri yoğun bir görev yaptığınız ve depolama GİB'lerinin darboğazınız olması.

Yine de uygun bir yol , aracının brokeragemerkezi bir aracı örneğinin tüm dezavantajları ile günlüğe kaydetmeyi - açıklandığı şekilde - yapmasına izin vermek olacaktır . Örneğin, aracı o kadar yüksek talep görüyorsa, memcached günlükleri depoya geri yazmak için asla nefes alan olmazsa, başka bir yaklaşım izlemeniz gerekir.

Sonuçta aracısız bir model elde edebilirsiniz. Yani işçiler kendi işlerini kendi aralarında yönetiyorlar. Basit bir örnekte, bir Dağıtılmış yuvarlak robin algoritması aracılığıyla.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.