2010-07-23 28 views
5

Bu yaz biraz araştırma yapıyorum ve mevcut kodu paralel hale getirmeye çalışıyorum. Şu anda ana odak, kodun dengesini yüklemek için bir yoldur, böylece küme üzerinde daha verimli çalışacaktır. Mevcut görev, her biri kendi yığınına sahip olan birkaç işlem oluşturan bir kavram kanıtı yapmaktır ve süreç yığın işlenmeyi bitirdiğinde, yığınlarında daha fazla iş olup olmadığını görmek için en yakın iki işlemi sorgular.Python Kullanarak Yük Dengeleme Uygulaması

Python bu kavramsallaştırma güçlük çekiyorum, ama doğru yönde işaret veya mpi4py veya ParallelPython ya benzer örnek bir çeşit olabilir birisi umuyordum. Ayrıca eğer daha iyi veya daha kolay bir modül bilen varsa, bu bilmek harika olur.

Teşekkürler.

cevap

11

İşte bunu yapmanın basit bir yolu.

  1. Yapacak tek bir ortak paylaşılan bir sıra oluşturur. Bu uygulama bu kuyruğu yapılacak iş ile dolduracaktır.

  2. kuyruktan bir öğe alır ve çalışır bir uygulama oluşturun.

Bu, tek üretici çoklu tüketici tasarımdır. İyi çalışır ve makinenizi paralel süreçlerle karıştırın.

Eğer çoklu işleme API çeşit kuyruğu sarmak gerekiyor, yerleşik kuyruk sınıf kullanın. http://docs.python.org/library/queue.html. Şahsen, kuyruğu çalıştıran küçük bir HTTP tabanlı web sunucusu oluşturmak istiyorum. Her uygulama bir sonraki iş parçasını almak için GET yapar.

Sen çok güzel paylaşılan sıra oluşturmak için RabbitMQ gibi araçlar kullanabilirsiniz. http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/

Sen JMS kuyruklar faydalanmak için http://hjb.python-hosting.com/ kullanmak mümkün olabilir.

oluşturabilir ve çalışma ile kuyruğu doldurmak için küçük bir uygulama gerekir.

istediğiniz gibi uygulamanın sayıda kopyasını oluşturun. Örneğin:

for i in 1 2 3 4 5 6 7 8 9 10 
do 
    python myapp.py & 
done 

Bu uygulamanın 10 eşzamanlı kopyalarını çalışacaktır. Tüm 10, tek bir sıradan iş almaya çalışıyor. Tüm mevcut CPU kaynaklarını kullanacaklar ve OS bunları sizin için iyi bir şekilde programlayacak.


Peer, düğümden düğüme senkronizasyonu O düğümler arasında (n * (n-1)/2) iletişim yolları anlamına gelir.

"İki bitişik düğümler", hala 2 * n iletişim yollarına sahip olduğunuzu ve çalışmaların düğümler arasında "bir şekilde" damlaması gerektiğini gösterir. Eğer düğümler başlangıçta iş ile tohumlanırsa, birileri iş yükünü dengelemek için çok fazla plan yaptı. Eğer bu kadar çok planlama yapacaksanız, düğümlerden neden senkronizasyon yapmasını isteyin?

Kuyruklar, her düğümün yavaş olabileceğinden başlamak için dikkatlice dengelenmemişse. Her garip düğüm hızlı olabilirdi.Garip düğümler önce tamamlanır, iki çift düğümden iş olup olmadığını kontrol eder ve bu düğümler (a) yapılmaz ve (b) daha fazla iş yapamazlar. Şimdi ne var? Düğümlerin yarısı çalışıyor, yarısı boş. Tüm işin ilk dağıtımında zayıf planlama nedeniyle.

Master-slave, n iletişim yollarınız olduğunu gösterir. Ayrıca, tüm boşta düğümler işe eşit erişim sağladığından dengeleme otomatiktir. Kötü performansa yol açan önyargılı bir başlangıç ​​dağıtımı diye bir şey yoktur.

+0

Bu programın mevcut tasarımına benzer, teşekkür ederim, ancak düğüm yapısı yerine bir efendi-köle yapısına bir düğüme sahip isteyen vardır. Birden fazla işlemden birçok kez erişilen tek bir sıraya sahip olmak, bir kümede olası bir darboğaz yaratır mı? – patemotter

+0

@DistortedLojik: Her çalışma paketi mikroskobik olarak küçük olmadıkça tek sıra sorun olmamalıdır. Bu çok yüksek bir yüke sahip olmak için kuyruğa erişim maliyetinin amortize edilmesini istiyor. –