2011-12-19 21 views
6

İki sunucum var: biri django uygulaması çalıştıran ve ikisi de bir rabbitmq kuyruğu ve bir kereviz işçisi çalıştıran. aşağıdaki gibi kuyruk/işçi çalıştıran sunucuda Benim tasks.py bir görevi içerir:Bu görevi içe aktarma sırasında bir Kereviz görevini yürütme

@task(queue="reports") 
def test_task(): 
    time.sleep(120) 

Amacım Django görünümünden bu görevi yürütmek etmektir. Görevin kodu, django görünümünden farklı bir sunucuda olduğundan, görevi çağırmak istiyorum, görevi django'dan çalışan makineye göndermek için aşağıdaki kodu kullanmaya çalışıyorum.

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue) 

Ben bu yöntemi here bulundu, ancak şu ana kadar işe yaramadı test.

Kereviz işçi sunucusundaki kereviz işçi günlük dosyasında kuyruk-F ile test ediyorum, daha sonra tarayıcıda send_task içeren görünümün URL'sine gidiyorum. Kuyruk çıktısında 'alınan' olarak görünme görevini arıyorum, ama değil.

Kereviz işçisinin günlük düzeyi DEBUG, günlük dosyası görevin doğru adla kaydedildiğini gösterir ve django uygulamasının settings.py öğesi tavşanmq sunucusu için doğru IP ve kimlik bilgilerini içerir. Farklı yaklaşımları denerken, zaman zaman geçerli bir görev (yani send_task ('asdf')) olmayan bir şey için send_task geçirilen dize değiştiğinde kereviz günlük dosyasında bir hata iletisi gördüm. Bu, günlük dosyasında bir UnregisteredError neden oldu. Bununla birlikte, bu yalnızca bazen olur ve farklı ayar kombinasyonlarını ve çağrıları test etmede şimdiye kadar, davranışları güvenilir bir şekilde çoğaltmanın bir yolunu bulamadım.

CELERY_RESULT_BACKEND = 'amqp' 
BROKER_HOST = 'the.correct.IP.address' 
BROKER_USER = 'the_correct_user' 
BROKER_PASSWORD = 'the_correct_pass' 
BROKER_VHOST = 'the_correct_vhost' 
BROKER_PORT = 5672 

Etrafa google'dan ve send_task çok bulamadı:

Ayrıca, bu (kaldırıldı gerçek değerler ile) Django projede settings.py ilgili bölümüdür. Neyi yanlış yaptığım hakkında bir fikrin var mı?

+0

Kodunuzu her iki makine arasında nasıl paylaştığınızı bilmek isterdim. İşte bununla ilgili yazdığım bir soru: http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server Teşekkürler! – lajarre

cevap

7

Çözüldü, send_task'a geçerken yayıncı anahtar kelimesi arg'ı geçersiz ve bir hata atıyor. Hatayı görmedim, çünkü AJAX-sayfanıza doğrudan yönlendirme yapmak yerine istekte bulundu. Bu durumla ilgili her şey doğruydu. Ayrıca gereksiz anahtar sözcük arclarını ve send_task'a iletilen arjları da kaldırdım.

send_task("tasks.test_task", task_id=task_id, queue=queue) 
2

Yapmaya çalıştığınız şey, yapmak istediğim şey imkansız. Kereviz işçileri, çalıştırılacakları görev koduna erişim gerektirir. Bunun etrafında bir yolu yok.

REVİZE:

Ama ne gerçekten yapmak istiyorum: Sadece ismen görevleri başvurmalıdır Django görünümü, işçilerin mevcut fakat DEĞİL kodu var.

+0

Kereviz işçilerinin koşacakları kodu istedikleri konusunda kesinlikle haklısınız ama sanırım orijinal gönderinin bir kısmını yanlış anladınız. Açık olmak gerekirse, çalışanın üzerinde görev kodu vardır - uzaktan gerçekleşmesini istediğim görevin * aranması *. Django görünümü, işçiye görevi yerine getirmesini söyler. –

+0

Yeniden düzenlendi! – dkamins

İlgili konular