2015-11-25 6 views
9

मैं एक फ्लास्क ऐप बना रहा हूं और चलाने के लिए कुछ पृष्ठभूमि प्रक्रियाओं की आवश्यकता है। मैंने मल्टीप्रोसेस के साथ जाने का फैसला किया, लेकिन फ्लास्क के भीतर चलते समय यह दो प्रक्रियाओं का उत्पादन कर रहा है। क्या कोई जानता है कि ऐसा क्यों होगा? मैंने ओएस एक्स और उबंटू 12.04 पर एक ही परिणाम के साथ इसका परीक्षण किया है।फ्लास्क ऐप के अंदर मल्टीप्रोसेस 2 प्रक्रियाओं को कताई

import time 
import multiprocessing 
from flask import Flask 

app = Flask(__name__) 
backProc = None 

def testFun(): 
    print('Starting') 
    while True: 
     time.sleep(3) 
     print('looping') 
     time.sleep(3) 
     print('3 Seconds Later') 

@app.route('/') 
def root(): 

    return 'Started a background process with PID ' + str(backProc.pid) + " is running: " + str(backProc.is_alive()) 

@app.route('/kill') 
def kill(): 
    backProc.terminate() 
    return 'killed: ' + str(backProc.pid) 

@app.route('/kill_all') 
def kill_all(): 
    proc = multiprocessing.active_children() 
    for p in proc: 
     p.terminate() 
    return 'killed all' 

@app.route('/active') 
def active(): 
    proc = multiprocessing.active_children() 
    arr = [] 
    for p in proc: 
     print(p.pid) 
     arr.append(p.pid) 

    return str(arr) 

@app.route('/start') 
def start(): 
    global backProc 
    backProc = multiprocessing.Process(target=testFun, args=(), daemon=True) 
    backProc.start() 
    return 'started: ' + str(backProc.pid) 

if __name__ == '__main__': 
    app.run(port=int("7879")) 
+0

मैं चाहता था पाइथन 2.7.x का उपयोग कर एक डिमन के रूप में चलने की प्रक्रिया के साथ एक प्रक्रिया async बनाने के लिए। समस्या यह है कि एंडपॉइंट में वापसी तब तक नहीं होती जब तक कि प्रक्रिया समाप्त नहीं हो जाती है, भले ही डिमन सही पर सेट हो। मैं इसे यूडब्ल्यूएसजीआई पर चला रहा हूं, शायद यही कारण है कि। – radtek

उत्तर

9

यह बोतल ऑटो पुनः लोड सुविधा, जो स्वत वेबसर्वर को पुनः आरंभ करने के लिए जब कोड में परिवर्तन का पता चला है विकास के दौरान प्रयोग किया जाता है के साथ एक समस्या है, बिना नए कोड को प्रदर्शित करने के लिए: यहाँ एक उदाहरण है एक मैनुअल पुनरारंभ की आवश्यकता है।

मार्गदर्शिका में, “app.run()” कॉल हमेशा “if __name__ == ‘__main__’” स्थिति के भीतर रखा जाता है, क्योंकि पुनः लोडर डिफ़ॉल्ट रूप से चालू होता है। बहु का उपयोग करते समय, इस हालत झूठी में परिणाम होगा, तो आप के बजाय बोतल autoreload को निष्क्रिय जब यह एक समारोह में उपयोग करते हुए इतना की तरह है:

def startWebserver(): 
      app.run(debug=True, use_reloader=False) 

संदर्भ के लिए लिंक:

http://blog.davidvassallo.me/2013/10/23/nugget-post-python-flask-framework-and-multiprocessing/

+0

बहुत बढ़िया, यह काम करता है। धन्यवाद, मैं –

+0

के साथ दीवार के खिलाफ अपने सिर को टक्कर लगी थी, हालांकि, मल्टीप्रोसेसिंग का उपयोग करके अपाचे/mod_wsgi का उपयोग करके फ्लास्क ऐप को तैनात करना बिल्कुल काम नहीं कर रहा है या बहुत अविश्वसनीय है। सेलरी, ह्यूई या आरक जैसे कार्य कतार का बेहतर उपयोग करें। – jjmurre

+0

@ jjmurre: आप अपाचे के लिए क्या समस्या का सामना कर रहे हैं? मैं अपाचे पर मल्टीप्रोसेसिंग के साथ अपने फ्लास्क एप्लिकेशन को तैनात करने की योजना बना रहा हूं। – gB08

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