2011-12-19 14 views
6

आयात करने में असमर्थ एक अजवाइन कार्य चल रहा है मैं दो सर्वर हैं: एक एक Django अनुप्रयोग चल रहा है और एक दोनों एक RabbitMQ कतार और एक अजवाइन कार्यकर्ता चल रहा है। कतार/कार्यकर्ता चल रहे सर्वर पर मेरे tasks.py एक कार्य इस प्रकार शामिल हैं:जब उस कार्य

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

मेरा लक्ष्य एक Django दृश्य से इस कार्य को निष्पादित करने के लिए है। चूंकि कार्य के लिए कोड django दृश्य से भिन्न सर्वर पर है, इसलिए मैं कार्य को कॉल करना चाहता हूं, मैं कार्य को डीजेंगो से कार्यकर्ता मशीन में भेजने के लिए निम्न कोड का उपयोग करने का प्रयास कर रहा हूं।

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

मैं इस विधि here पाया है, लेकिन अब तक का परीक्षण यह काम नहीं किया है।

मैं सेलरी कार्यकर्ता सर्वर पर अजवाइन कार्यकर्ता लॉगफाइल पर पूंछ-एफ के साथ परीक्षण कर रहा हूं, फिर ब्राउज़र में send_task युक्त दृश्य के यूआरएल पर नेविगेट कर रहा हूं। मैं पूंछ के उत्पादन में 'प्राप्त' के रूप में दिखाने के लिए काम की तलाश में हूं, लेकिन ऐसा नहीं है।

सेलेरी कार्यकर्ता का लॉग स्तर DEBUG है, लॉगफाइल दिखाता है कि कार्य उचित नाम से पंजीकृत है, और django ऐप की सेटिंग्स.py में rabbitmq सर्वर के लिए सही आईपी और प्रमाण-पत्र शामिल हैं। अलग-अलग दृष्टिकोणों की कोशिश करने में, मैंने कभी-कभी सेलेरी लॉगफाइल में एक त्रुटि संदेश देखा है जब मैंने एक वैध कार्य नहीं था (यानी send_task ('asdf') को भेजने के लिए भेजा गया स्ट्रिंग बदल दिया है। इसने लॉगफाइल में एक अनियंत्रित त्रुटि उत्पन्न की। हालांकि, यह कभी-कभी होता है, और अब तक सेटिंग्स और कॉल के विभिन्न संयोजनों का परीक्षण करने में, मुझे व्यवहार को विश्वसनीय रूप से दोहराने का कोई तरीका नहीं मिला है।

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 

मैं आसपास googled है और send_task पर ज्यादा नहीं मिला है:

इसके अलावा, इस प्रासंगिक (हटाया वास्तविक मूल्यों के साथ) Django परियोजना पर settings.py की धारा है। क्या मैं गलत क्या कर रहा हूं पर कोई विचार?

+0

मुझे यह जानने में दिलचस्पी होगी कि आपने दोनों मशीनों के बीच अपना कोड कैसे साझा किया है। यहां एक प्रश्न है जो मैंने उससे लिखा था: http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server धन्यवाद! – lajarre

उत्तर

7

हल, पता चला है प्रकाशक कीवर्ड आर्ग मैं send_task को गुजर रहा था अवैध और एक त्रुटि फेंक रहा था। त्रुटि को नहीं देखा क्योंकि मैं AJAX- सीधे इसे नेविगेट करने के बजाय पृष्ठ का अनुरोध कर रहा था। इस स्थिति के बारे में सबकुछ सही था। मैंने अनावश्यक खोजशब्द तर्क और send_task को पास किए जाने वाले तर्कों को भी हटा दिया।

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

क्या [मैंने सोचा था कि आप ऐसा करने की कोशिश कर रहे थे] असंभव है। सेलेरी श्रमिकों को उनके द्वारा चलाए जाने वाले कार्य कोड तक पहुंच की आवश्यकता होती है। उसके चारों ओर कोई रास्ता नहीं है।

संशोधित:

लेकिन क्या तुम सच में करना चाहते हैं: कोड Django दृश्य है, जो केवल नाम से कार्य का संदर्भ लेना चाहिए, लेकिन श्रमिकों के लिए उपलब्ध नहीं है।

+0

आप बिल्कुल सही हैं कि अजवाइन श्रमिकों को उनके द्वारा चलाए जाने वाले कोड की आवश्यकता होती है, लेकिन मुझे लगता है कि आपने मूल पोस्ट का हिस्सा गलत समझा है। स्पष्ट होने के लिए, कार्यकर्ता के पास कार्य कोड है - यह उस कार्य का * कॉलिंग * है जिसे मैं दूरस्थ रूप से करना चाहता हूं। तो django दृश्य कार्यकर्ता को कार्य चलाने के लिए कहता है। –

+0

संशोधित संशोधित! – dkamins