अजवाइन - वितरित नौकरी कतार

इस बार हमने एक अद्भुत उत्पाद के बारे में बात करने का फैसला किया जिसका उपयोग हम अपने काम में करते हैं। यह सेलेरी के बारे में होगा - "वितरित कार्य कतार"। यह एक वितरित एसिंक्रोनस जॉब कतार है जिसमें व्यापक कार्यक्षमता है। हमारी साइट बिल्डर में, हमें अक्सर उन कार्यों को चलाना पड़ता है जो उपयोगकर्ता की प्रतिक्रिया के संदर्भ में अतुल्यकालिक हैं। दुर्भाग्य से, इस उत्पाद के बारे में अधिक जानकारी नहीं है, लेकिन यह एक अलग उल्लेख के योग्य है, हम इसे ठीक करना चाहते हैं।



तो, अजवाइन क्या कर सकता है :





में रुचि रखते हैं? हम बिल्ली मांगते हैं।



चलो कार्यकर्ता के कॉन्फ़िगरेशन के साथ शुरू करते हैं। यह एक डेमॉन है जो वास्तव में कतार से कार्यों को प्राप्त करता है और उन्हें निष्पादित करता है। अनुशंसित कतार RabbitMQ है, लेकिन अब हमने MongoDB के माध्यम से खुद को यहूदी बस्ती तक सीमित कर लिया है। रेडिस और आरडीबीएमएस द्वारा भी समर्थित है।



celeryconfig.py:



CARROT_BACKEND = "ghettoq.taproot.MongoDB" BROKER_HOST = "xxx" BROKER_PORT = 27017 BROKER_VHOST = "celery" CELERY_SEND_TASK_ERROR_EMAILS = True ADMINS = ( ('Admin', 'admin@localhost'), ) CELERYD_MAX_TASKS_PER_CHILD = 5 CELERY_IMPORTS = ("tasks", ) CELERY_DISABLE_RATE_LIMITS = True CELERY_RESULT_BACKEND = "mongodb" CELERY_MONGODB_BACKEND_SETTINGS = { "host": "xxx", "port": 27017, "database": "celery", "taskmeta_collection": "my_taskmeta_collection", }
      
      







रन डेमॉन: celeryd -l INFO -B

हम कंसोल में लॉगिंग सक्षम करते हैं और विकल्प-बी आवधिक कार्य डेमॉन शुरू करते हैं। बाद वाले को सेलरीबीट कमांड द्वारा अलग से चलाया जा सकता है



अब एक परीक्षण कार्य बनाएँ। कॉन्फ़िगरेशन में, हम कार्यों को आयात करते हैं, इसलिए हमारे लिए कार्य फ़ाइल कार्य-सूची है:



 from celery.decorators import task from celery.decorators import periodic_task from celery.task.schedules import crontab @periodic_task(run_every=timedelta(seconds=60)) def mail_queue(): print "Task is executed every minute" @periodic_task(run_every=crontab(hour=0, minute=10)) def transactions(): print "Task is executed every day on 0:10" @task def delayed_function(id): some_function() @task def delayed_heavy_function(id): some_heavy_function()
      
      







इसलिए, हमारे पास कार्यों में 4 कार्य हैं। पहले दो शेड्यूल किए गए हैं, जैसा कि वे @periodic_task डेकोरेटर के साथ चिह्नित हैं। लेकिन अंतिम दो को प्रोग्राम कोड से सीधे बुलाया जाएगा। इस तरह से:



 from tasks import delayed_function, delayed_heavy_function delayed_function.apply_async(args=[id], countdown=300) #    300  r = delayed_heavy_function.delay(id) #  (   ),   
      
      







अब, परिणाम और अंतिम कार्य पूरा होने के तथ्य को ट्रैक करने के लिए, हम करेंगे:



r। पहले से ही () # रिटर्न सही है अगर काम किया

r.result # निष्पादित फ़ंक्शन का मान लौटाता है या कोई भी यदि पहले से निष्पादित नहीं किया गया है (अतुल्यकालिक रूप से)

r.get () # कार्य पूरा होने और उसके परिणाम (समकालिक) को वापस करने के लिए प्रतीक्षा करेगा



चर r को cPickle के माध्यम से चलाया जा सकता है, कैश में मान डालें और कार्य स्थिति को ajax के साथ पूछताछ करें। या आप कार्य आईडी प्राप्त कर सकते हैं, और इसे कैश में डाल सकते हैं। इसके अलावा, आप कार्य आईडी को स्वयं सेट कर सकते हैं, मुख्य बात यह है कि यह अद्वितीय है।



अजवाइन का भारी उपयोग करने के बाद, हमें घेटोक कतार प्रबंधक के साथ कार्यों के निष्पादन में देरी से संबंधित कई त्रुटियां मिलीं, लेकिन लेखक द्वारा जीथब पर इस मुद्दे को बनाए जाने के दिन वे सभी सही हो गए, जिसके लिए मैं उन्हें धन्यवाद देता हूं।



बहुत पहले नहीं, संस्करण 2.0 जारी किया गया था, जो django- निर्भर होना बंद हो गया, और django के साथ एकीकरण अब एक अलग उप-परियोजना अजवाइन-django में ले जाया गया है।



अजवाइन की दो सीमाओं को प्रतिष्ठित किया जा सकता है, अधिक सटीक रूप से, ये सिर्फ विशेषताएं हैं: श्रमिक एक मानक FreeBSD पर काम नहीं करेंगे, क्योंकि अजगर बहुसंकेतन नहीं है, हालांकि नेटवर्क पर अजवाइन के लिए एक कर्नेल बनाने के लिए व्यंजनों हैं; कार्यों को अधिभारित करने के लिए, आपको कार्यकर्ता को पुनरारंभ करना होगा ताकि यह कार्यों और संबंधित कार्यों के लिए नए अजगर कोड को लोड करे। यह लिनक्स पर बहुत अच्छा काम करता है।



All Articles