2013-02-06 16 views
6

1) Şu anda bir REST api ortaya koyan bir web uygulaması üzerinde çalışıyorum ve isteği işlemek ve çözmek için Django ve Kerevizi kullanıyor. Çözülmesi için bir talep için, bir amqp kuyruğuna bir dizi kereviz görevi sunulmalıdır, böylece işçiler üzerinde çalıştırılırlar (diğer makinelerde yer alırlar). Her görev çok yoğun bir şekilde yoğun bir işlemdir ve bitirmek için çok uzun (saatler) sürmektedir.Django-kereviz projesi, sonuç-arka uçtan sonuçların nasıl ele alınacağı?

Ayrıca, sonuç olarak arka uç olarak amqp kullanacak şekilde Kerery'yi yapılandırdım ve Celery'nin aracı olarak RabbitMQ kullanıyorum.

Her görev, bir DB'de daha sonra depolanması gereken bir sonucu döndürür, ancak doğrudan işçiler tarafından değil. Sadece "merkezi düğüm" - RabbitMQ kuyruğunda django-kereviz ve yayınlama görevlerini yürüten makine - bu depolama birimine erişime sahiptir, bu nedenle işçilerin sonuçlarının bu makinede bir şekilde geri dönmesi gerekir.

Sorun, daha sonra görev yürütme sonuçlarını nasıl işleyebilirim? Bir işçi bittikten sonra, sonuç, yapılandırılmış sonuç-arka planda (amqp) saklanır, ancak şimdi sonuçları oradan almak ve işlemek için en iyi yolun ne olacağını bilmiyorum. temelde ben düzenli olarak bu komutu çalıştırır kod özel bir parçasına ihtiyacımız olduğu anlamına gelir

result.state 

:

ı belgelerinde bulabildiğim tüm

Birlikte zaman zaman sonuçları durumunu kontrol edebilir ya olmasıdır ve bu nedenle sadece bununla meşgul bir bütün iplik/işlem tutar, ya her şeyi engellemek için: bir görev bitene kadar ben istemez budur,

result.get() 

.

Düşünebildiğim tek çözüm, "merkezi düğümde", her görev tarafından teslim edilen async_results öğelerini temelde kontrol eden ve görev varsa eylemde bulunacak bir işlev olan ek bir iş parçacığına sahip olmaktır. bitmiş bir durum.

Başka herhangi bir öneri var mı? Ayrıca, arka uç sonuçlarının işlenmesi "merkezi düğümde" gerçekleştiği için, bu işlemin bu makine üzerindeki etkisini en aza indirgemektir.

Bunu yapmanın en iyi yolu ne olurdu?

2) İnsanlar genellikle işçilerden elde edilen sonuçlarla uğraşma ve arka uç sonuçlarına nasıl yaklaşma problemini çözer? (arka uç sonuçlarının yapılandırıldığını varsayarsak)

+0

'Merkezi düğümde bir kereviz görevi tüketicisi. Bu tüketicinin amacı, verileri veritabanına kaydetmek. Bu, yalnızca iş alanı içinde veri bulunduğunda çalışır, dolayısıyla periyodik değildir. – Crazyshezy

cevap

1

Sorunuzu tam olarak anladığımdan emin değilim, ancak her görevin bir görev kimliğine sahip olduğunu göz önünde bulundurun. görevler kullanıcılar tarafından gönderildiğinden Eğer kimlikleri depolamak ve daha sonra aşağıdaki gibi json kullanarak sonuç kontrol edebilirsiniz:

#urls.py 
from djcelery.views import is_task_successful 

urlpatterns += patterns('', 
    url(r'(?P<task_id>[\w\d\-\.]+)/done/?$', is_task_successful, 
     name='celery-is_task_successful'), 
    ) 

Diğer ilgili kavram signals her bitmiş görev bir sinyal yayar olmasıdır. Finişli bir görev, bir görev_success sinyali verecektir. Daha fazla real time proc bulunabilir.

+0

Evet, ve problem, zaman zaman işin durumunu kontrol etmek için sinyalleri veya bir şeyi kontrol edebilmek için bir etkinlik tüketicisine ihtiyacım vardı ... ve bu, işleri gönderen kısımdan bağımsızydı çünkü İş gönderme sürecini görev kimlikleri üzerinden döngü ile engellemek istiyorum ... Soru şu ki, insanlar genellikle bunu nasıl yapıyor? – Clara

+0

Tamam, sanırım cevabımı gerçek zamanlı proc hakkında bana gönderdiğiniz linkte buldum. Teşekkürler! – Clara

İlgili konular