2012-08-17 27 views
14

मैं एक काम है (एक काम यह सुनिश्चित करना केवल एक समय में एक क्रियान्वित किया जाता है),:अजवाइन काम अनुसूची कुछ इस तरह

@task() 
def async_work(info): 
    ... 

किसी भी पल में, मैं कुछ जानकारी के साथ async_work कह सकते हैं। किसी कारण से, मुझे यह सुनिश्चित करना है कि एक समय में केवल एक async_work चल रहा है, अन्य कॉलिंग अनुरोध का इंतजार करना चाहिए।

तो मैं निम्नलिखित कोड के साथ आते हैं:

is_locked = False  
@task() 
    def async_work(info): 
     while is_locked: 
      pass 
     is_locked = True 
     ... 
     is_locked = False 

लेकिन यह कहना है कि वह स्थानीय चर का उपयोग करने की अवैध है ... कैसे इसे हल करने की?

+0

क्या आप सही त्रुटि संदेश पोस्ट कर सकते हैं? –

उत्तर

21

स्थानीय चरों तक पहुंचने के लिए यह अमान्य है क्योंकि आपके पास कई सेलेरी श्रमिक कार्य चल रहे हैं। और वे कर्मचारी भी विभिन्न मेजबानों पर हो सकते हैं। इसलिए, मूल रूप से, is_locked परिवर्तनीय उदाहरण हैं क्योंकि कई सेलेरी कर्मचारी आपके async_work कार्य चला रहे हैं। इस प्रकार, भले ही आपका कोड कोई त्रुटि नहीं उठाएगा, आपको इसके साथ वांछित प्रभाव नहीं मिलेगा।

आपको लक्ष्य प्राप्त करने के लिए आपको केवल एक कार्यकर्ता चलाने के लिए सेलेरी को कॉन्फ़िगर करने की आवश्यकता है। चूंकि कोई भी कर्मचारी किसी भी समय एक ही कार्य को संसाधित कर सकता है, आपको वह चाहिए जो आपको चाहिए।

संपादित करें:

Workers Guide > Concurrency के अनुसार:

डिफ़ॉल्ट बहु द्वारा कार्यों की समवर्ती निष्पादन प्रदर्शन करने के लिए प्रयोग किया जाता है, लेकिन आप यह भी Eventlet उपयोग कर सकते हैं। प्रक्रियाओं/धागे की संख्या --concurrency तर्क का उपयोग करके बदल दी जा सकती है और मशीन पर उपलब्ध CPUs की संख्या के लिए डिफ़ॉल्ट हो सकती है।

इस प्रकार आप इस तरह कार्यकर्ता चलाने की आवश्यकता:

$ celery worker --concurrency=1 

संपादित करें 2:

हैरानी की बात है वहाँ एक और समाधान है, इसके अलावा यह है सरकारी डॉक्स में भी, Ensuring a task is only executed one at a time लेख देखें ।

+0

क्या आप इसे और अधिक स्पष्ट रूप से समझा सकते हैं? केवल एक कार्यकर्ता चलाने के लिए सेलेरी को कॉन्फ़िगर कैसे करें? –

+0

"$ सेलेरी कार्यकर्ता --concurrency = 1" यह ठीक काम करता है! सच में शुक्रिया। –

संबंधित मुद्दे