2012-09-07 12 views
6

मुझे अपने फ्लास्क ऐप में कुछ लंबा काम करना है। और मैं इसे async करना चाहता हूँ। बस काम करना शुरू करें, और फिर जावास्क्रिप्ट से स्थिति की जांच करें।फ्लास्क लंबी दिनचर्या

मैं की तरह कुछ करने के लिए कोशिश कर रहा हूँ:

@app.route('/sync') 
def sync(): 
    p = Process(target=routine, args=('abc',)) 
    p.start() 

    return "Working..." 

लेकिन यह यह मृत gunicorn कार्यकर्ताओं पैदा करता है।

इसे कैसे हल किया जा सकता है? क्या मुझे सेलेरी की तरह कुछ इस्तेमाल करना चाहिए?

उत्तर

11

कई विकल्प हैं। आप अपना खुद का समाधान विकसित कर सकते हैं, सेलेरी या ट्विस्ट का उपयोग कर सकते हैं (मुझे यकीन है कि वहां पहले से ही अधिक से अधिक विकल्प हैं लेकिन वे सबसे आम हैं)।

अपने घर के समाधान का विकास करना मुश्किल नहीं है। एक काम आप कार्य आईडी और स्थिति के साथ अपने डेटाबेस में एक पंक्ति सम्मिलित आता है

  • : आप अजगर मानक पुस्तकालय की multiprocessing मॉड्यूल का उपयोग कर सकते हैं।
  • फिर काम करने के लिए एक प्रक्रिया लॉन्च करें जो खत्म होने पर पंक्ति स्थिति अद्यतन करता है।
  • आप यह देखने के लिए देख सकते हैं कि कार्य समाप्त हो गया है, जो वास्तव में संबंधित स्थिति की जांच करता है।

बेशक आपको यह सोचना होगा कि आप गणना के परिणाम को स्टोर करना चाहते हैं और त्रुटियों के साथ क्या होता है।

सेलेरी के साथ जाना भी आसान है। यह निम्नलिखित की तरह दिखेगा। बजाय mytask(data) की तरह सीधे कार्य बुला, की फिर

@celery.task 
def mytask(data): 

    ... do a lot of work ... 

है, जो इसे सीधे अमल होता है, delay विधि का उपयोग करें: एक समारोह को परिभाषित करने के एसिंक्रोनस रूप से निष्पादित करने के लिए अंत में

result = mytask.delay(mydata) 

, आप जांच कर सकते हैं परिणाम उपलब्ध है या नहीं ready साथ:

result.ready() 

हालांकि, remembe सेलेरी का उपयोग करने के लिए आपको बाहरी कर्मचारी प्रक्रिया चलाने की आवश्यकता है।

मैंने कभी भी मुड़ने का नज़र नहीं लिया है, इसलिए मैं आपको यह नहीं बता सकता कि यह इससे कम या कम जटिल है (लेकिन यह करना ठीक है कि आप जो भी करना चाहते हैं)।

किसी भी मामले में, इनमें से किसी भी समाधान को फ्लास्क के साथ ठीक काम करना चाहिए। परिणाम देखने के लिए यदि आप जावास्क्रिप्ट का उपयोग करते हैं तो पर सभी पर कोई फर्क नहीं पड़ता। बस उस दृश्य को देखें जो स्टेटस रिटर्न JSON जांचता है (आप फ्लास्क के jsonify का उपयोग कर सकते हैं)।

+0

ठीक है, मेरे पास वास्तव में सबकुछ है जो आपने डीबी में परिणामों को संग्रहीत करने के बारे में कहा था। अपने स्वयं के समाधान को लागू करने में मुख्य समस्या यह है कि जब मैं 'मल्टीप्रोसेसिंग' का उपयोग कर रहा हूं तो यह बंदूकधारी कार्यकर्ता को निष्क्रिय कर देता है। – sashab

+0

ओह, मुझे खेद है कि मैंने आपके प्रश्न को गलत तरीके से पढ़ा। ऐसा लगता है कि आपकी समस्या यह है कि आपकी मूल प्रक्रिया रिटर्न स्टेटमेंट के बाद समाप्त हो रही है, जो आपके द्वारा अभी बनाई गई बाल प्रक्रिया को प्रभावी रूप से मार देती है। इससे बचने के लिए, आपको माता-पिता से बाहर निकलने से पहले बच्चे को डिमन करना होगा (यानी इसे अलग करें) [पायथन-डेमन] (http://pypi.python.org/pypi/python-daemon/) – pacha

+0

मुझे 'ValueError: I मिलता है I/ओ बंद फ़ाइल पर ऑपरेशन 'जब मल्टीप्रोसेसिंग के साथ इसका उपयोग करें। ऐसा लगता है कि मुझे पॉपन का उपयोग करने की आवश्यकता है। 'प्रक्रिया()। Daemon = True' को सेट करने से भी मदद नहीं मिलती है। – sashab

2

मैं एक संदेश ब्रोकर जैसे खरगोश या सक्रियएमक का उपयोग करता हूं। फ्लास्क प्रक्रिया संदेश कतार में नौकरियां जोड़ती है और एक लंबी चल रही कार्यकर्ता प्रक्रिया (या पूल या कार्यकर्ता प्रक्रिया) उन्हें पूरा करने के लिए कतार से नौकरियां लेती है। कार्यकर्ता प्रक्रिया फ़्लास्क सर्वर को नौकरी की वर्तमान स्थिति जानने और ग्राहकों को यह जानकारी पास करने की अनुमति देने के लिए डेटाबेस अपडेट कर सकती है।

अजवाइन का उपयोग करना ऐसा करने का एक अच्छा तरीका प्रतीत होता है।