2016-11-18 11 views
11

के भीतर मल्टीथ्रेडिंग मैं एपीआई अनुरोधों से डेटा संसाधित करने के लिए RabbitMQ के साथ सेलेरी का उपयोग कर रहा हूं। प्रक्रिया इस प्रकार है:एक सेलेरी वर्कर

अनुरोध -> एपीआई -> RabbitMQ -> अजवाइन कार्यकर्ता -> लौटें

आदर्श रूप में मैं और अधिक अजवाइन कार्यकर्ताओं अंडे हैं लेकिन मैं स्मृति की कमी के द्वारा प्रतिबंधित कर रहा हूँ।

वर्तमान में, मेरी प्रक्रिया में बाधा कार्यकर्ता में पारित यूआरएल से डेटा लाने और डाउनलोड कर रही है। Roughy, प्रक्रिया इस प्रकार है:

celery_gets_job(url): 
    var data = fetches_url(url) # takes 0.1s to 1.0s (bottleneck) 
    var result = processes_data(data) # takes 0.1ss 
    return result 

यह अस्वीकार्य है के रूप में कार्यकर्ता थोड़ी देर के लिए बंद कर दिया जाता है, जबकि URL प्राप्त करने में। मैं सूत्रण के माध्यम से इस में सुधार लाने के लिए देख रहा हूँ, लेकिन मैं अनिश्चित क्या सर्वोत्तम प्रथाओं हैं हूँ:

  • वहाँ एक में एक ही समय में डेटा को संसाधित करते समय आने वाले डेटा एसिंक्रोनस रूप से अजवाइन कार्यकर्ता डाउनलोड करने के लिए एक रास्ता है अलग धागा?

  • क्या मेरे पास अलग-अलग श्रमिकों को लाने और प्रसंस्करण करना चाहिए, संदेश के कुछ रूपों के साथ, संभवतः खरगोश एमक्यू के माध्यम से?

+1

आप दो मल्टीप्रोसेस बनाकर सेलेरी कार्य के भीतर [मल्टीप्रोसेसिंग पाइप] (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Pipe) जैसे कुछ का उपयोग करने पर विचार कर सकते हैं। अपने मल्टीप्रोसेसिंग प्रक्रियाओं को पूल द्वारा प्रतिबंधित किया जाना चाहिए। खरगोश/परिणाम बैकएंड पर यूआरएल का बड़ा डेटा साझा करना अच्छा नहीं होगा अगर मैं गलत नहीं हूं। सेलेरी निम्न स्तर एपीआई में कुछ समान कार्यक्षमता भी हो सकती है। –

+1

मुझे खरगोश एमक्यू से अवगत नहीं है, लेकिन मुझे लगता है कि मल्टीप्रोसेसिंग मल्टीथ्रेडिंग के मुकाबले आपके लिए अधिक उपयुक्त होगी क्योंकि 'celery_gets_job' में कई गैर-परमाणु संचालन हैं और यह मल्टीथ्रेडिंग का उपयोग करते समय समस्याएं पैदा करेगा। आप क्यूई का उपयोग कर सकते हैं जहां 'fetches_url (url)' चलाने वाली प्रक्रियाओं के पूल द्वारा डेटा पॉप्युलेट किया जाता है और 'process_data (डेटा)' – shrishinde

+0

करने के लिए एक और प्रक्रिया (एसएस) यह हो सकता है कि आप जो खोज रहे हैं: http: // stackoverflow। कॉम/प्रश्न/28315657/अजवाइन-घटना-गैर-अवरुद्ध-अनुरोध – fpbhb

उत्तर

1

eventlet पुस्तकालय का उपयोग करना, आप उन्हें अतुल्यकालिक बनाने के लिए मानक पुस्तकालयों पैच कर सकते हैं।

पहले आयात async urllib2:

from eventlet.green import urllib2 

तो आप के साथ यूआरएल शरीर मिल जाएगा:

def fetch(url): 
    body = urllib2.urlopen(url).read() 
    return body 

अधिक eventlet उदाहरण here देखें।

+2

इसके अलावा, इवेंटलेट निष्पादन पूल का उपयोग सीधे http://docs.celeryproject.org/en/latest/userguide/concurrency/eventlet.html स्वचालित रूप से बंदर पैच आईओ कॉल करना चाहिए। – dyeray

+0

लेकिन फिर 'process_data (डेटा)' अभी भी ब्लॉक नहीं होगा और संयुक्त परिणाम को पहले से धीमा कर देगा? – ostrokach

0

मैं दो कार्यों को बनाउंगा, एक डेटा डाउनलोड करने के लिए और दूसरे इसे डाउनलोड करने के बाद प्रोसेसिंग के लिए। इस तरह आप स्वतंत्र रूप से दो कार्यों को स्केल कर सकते हैं। देखें: Routing, Chains

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