2012-10-02 14 views
19

में स्थानीय रूप से चल रहे सेलेरी/Django कार्यों को डीबग करने के लिए कैसे मुझे ग्रहण डीबगर से सेलेरी कार्य डीबग करने की आवश्यकता है। मैं ग्रहण, पायडेव और Django का उपयोग कर रहा हूँ।ग्रहण

सबसे पहले, मैं ग्रहण में अपनी परियोजना खोलता हूं और कार्य फ़ंक्शन की शुरुआत में ब्रेकपॉइंट डालता हूं।

फिर, मैं पाइडेव पैकेज एक्सप्लोरर से manage.py पर राइट क्लिकिंग द्वारा एक्लीप्से से सेलेरी श्रमिकों को शुरू कर रहा हूं और "डीबग एएस-> पायथन रन" चुन रहा हूं और तर्क के रूप में "celeryd -l info" निर्दिष्ट कर रहा हूं। यह मुख्यधारा, मध्यस्थ और ग्रहण डीबगर से दिखाई देने वाले तीन और धागे शुरू करता है।

उसके बाद मैं PyDev दृश्य पर वापस लौट सकते हैं और परियोजना पर राइट क्लिक करके मुख्य आवेदन शुरू करने और चुनने भागो के रूप में/PyDev: Django

मेरे मुद्दों है कि एक बार काम mytask.delay द्वारा प्रस्तुत किया जाता है() यह ब्रेकपॉइंट पर नहीं रुकता है। मैंने कार्य कोड के साथ कुछ निशान लगाए हैं, इसलिए मैं देख सकता हूं कि इसे कार्यकर्ता थ्रेड में से एक में निष्पादित किया गया था।

तो, सेलरी श्रमिक थ्रेड में निष्पादित होने पर कार्य के साथ किए गए ब्रेकपॉइंट पर ग्रहण डीबगर को रोकने के लिए कैसे करें?

उत्तर

28

आपको मुख्य प्रक्रिया (आमतौर पर यह एक अलग प्रक्रिया पर चलता है) के समान थ्रेड में सेलेरी कार्य चलाने का विकल्प मानना ​​चाहिए, इससे डीबग बहुत आसान हो जाएगा।

आप अपने settings.py मॉड्यूल के लिए यह सेटिंग जोड़कर सिंक में काम चलाने के लिए अजवाइन बता सकते हैं:

CELERY_ALWAYS_EAGER = True 

नोटः यह केवल डिबगिंग या विकास के चरण के लिए उपयोग में करने के लिए है!

+0

धन्यवाद, यह आंशिक रूप से इस मुद्दे को हल करता है। लेकिन अगर मुझे विभिन्न धागे में समानांतर में चल रहे कार्यों को डीबग करने की ज़रूरत है तो क्या होगा? – spoonboy

+3

पीडीबी के बारे में क्या? यहां देखें http://docs.celeryproject.org/en/latest/tutorials/debugging.html –

+0

आप देखते हैं, मुझे इसे दूरस्थ रूप से डीबग करने की आवश्यकता नहीं है। मैं सिर्फ अलग-अलग धागे में ग्रहण में स्थानीय रूप से डीबग करना चाहता हूं। – spoonboy

-1

यदि यह केवल एक अलग धागे पर चलता है, तो इसे नवीनतम पायडेव संस्करणों पर काम करना चाहिए (मुझे लगता है कि एक स्प्रेड थ्रेड डीबग नहीं किया जाएगा, लेकिन यह तय किया गया था)।

अब, यदि यह एक अलग प्रक्रिया पर लॉन्च हो रहा है, तो आपको रिमोट डीबगर का उपयोग करने की आवश्यकता है (भले ही यह एक ही मशीन पर हो)। देखें: http://pydev.org/manual_adv_remote_debugger.html

+0

दुर्भाग्य से 2.7.3 में ऊपर वर्णित जैसा लगता है। –

5

CELERYD_POOLcelery.concurrency.prefork:TaskPool पर डिफ़ॉल्ट है जो प्रत्येक कार्यकर्ता के लिए अलग-अलग प्रक्रियाओं को जन्म देगा और PyDev उनके अंदर नहीं देख सकता है। यदि आप इसे थ्रेडेड विकल्पों में से किसी एक में बदलते हैं तो आप डीबगर का उपयोग कर सकते हैं।

उदाहरण के लिए

, अजवाइन 3.1 के लिए आप इस सेटिंग का उपयोग कर सकते हैं:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool' 

ध्यान दें कि यह threadpool मॉड्यूल स्थापित करने की आवश्यकता है।

यह भी सुनिश्चित करें कि CELERY_ALWAYS_EAGER = False है, अन्यथा पूल कक्षा को बदलने से कोई मतलब नहीं है।

+0

वाह यह बहुत बढ़िया लगता है! –

0

मैं परीक्षण कार्य करने के लिए एक प्रबंधन कमांड बनाने .. यह खोल से इसे चलाने की तुलना में आसान लगता है ..

10

आप का उपयोग कर ऐसा कर सकते हैं अजवाइन के rdb:

from celery.contrib import rdb 
rdb.set_trace() 

फिर, एक अलग टर्मिनल प्रकार में telnet localhost 6900, और आपको डीबग प्रॉम्प्ट मिलेगा।

+2

या पोर्ट 6901 - सेलेरी शब्द में संदेश का पालन करें –