2016-01-11 8 views
8

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

आवश्यक:

pip install Flask 
pip install eventlet 

मैं अब तक इंटरनेट पर क्या मिला द्वारा मेरी समझ से, यह इस तरह काम करना चाहिए:

# activate eventlet 
import eventlet 
eventlet.monkey_patch() 

from flask import Flask 

import datetime 
from time import sleep 

# create a new Flask application 
app = Flask(__name__) 

# a short running task that returns immediately 
@app.route('/shortTask') 
def short_running_task(): 
    start = datetime.datetime.now() 
    return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now()) 

# a long running tasks that returns after 30s 
@app.route('/longTask') 
def long_running_task(): 
    start = datetime.datetime.now() 
    sleep(30) 
    return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now()) 

# run the webserver 
if __name__ == '__main__': 
    app.run(debug=True) 

जब इस फाइल चल रहा है, तो एक webbrowser में http://localhost:5000/longTask खोलने टैब और जब भी यह http://localhost:5000/shortTask के साथ एक और टैब खोलने की प्रक्रिया कर रहा है, तो मुझे उम्मीद है कि दूसरा टैब तुरंत वापस लौटने की उम्मीद करेगा जबकि पहला टैब अभी भी लोड हो रहा है। हालांकि, मानक Werkzeug सर्वर पर इसे चलाने के समान, दूसरा टैब केवल 30 के बाद समाप्त होने के बाद ही लौटाता है।

यहां क्या गलत है? वैसे, क्या यह आमतौर पर फ्लास्क के लिए "उत्पादन तैयार वेबसर्वर" के रूप में जाना जाता है, यह देखते हुए कि केवल कुछ समवर्ती उपयोगकर्ताओं की अपेक्षा की जा सकती है (अधिकतम 5)?

वैसे, जब मैं वेबसर्वर चलाने के लिए the Flask-socketio library का उपयोग करता हूं, जो दस्तावेज़ीकरण के अनुसार स्वचालित रूप से इवेंटलेट चुनता है, तो यह अपेक्षा के अनुसार काम करता है। कुप्पी के socketio साथ

पूरा उदाहरण:

# activate eventlet 
import eventlet 
eventlet.monkey_patch() 

from flask import Flask 
from flask_socketio import SocketIO 

import datetime 
from time import sleep 

# create a new Flask application 
app = Flask(__name__) 

# activate Flask-socketio 
socketio = SocketIO(app) 

# a short running task that returns immediately 
@app.route('/shortTask') 
def short_running_task(): 
    start = datetime.datetime.now() 
    return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now()) 

# a long running tasks that returns after 30s 
@app.route('/longTask') 
def long_running_task(): 
    start = datetime.datetime.now() 
    sleep(30) 
    return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now()) 

# run the webserver with socketio 
if __name__ == '__main__': 
    socketio.run(app, debug=True) 

उत्तर

11

जब आप app.run(debug=True) चलाते हैं तो आप स्पष्ट रूप से विकास वेब सर्वर पर अपना एप्लिकेशन चलाने के लिए फ्लास्क को स्पष्ट रूप से बता रहे हैं, जो वेर्कज़ुग पर आधारित है। इससे कोई फर्क नहीं पड़ता कि आपने ईवेंटलेट लोड किया है।

wsgi.server(eventlet.listen(('', 8000)), your_app) 

यह कम या ज्यादा क्या socketio.run() करता है:

आप eventlet वेब सर्वर पर आपके आवेदन को चलाना चाहते हैं, तो आप इस प्रकार एक eventlet वेब सर्वर है, जो the documentation के अनुसार शुरू कर दिया है शुरू कर दिया है वैकल्पिक रूप से एसएसएल को संभालने के लिए थोड़ी अधिक जटिलता के साथ, मेरे फ्लास्क-सॉकेटियो एक्सटेंशन में। कोड की रेखाएं जो यह करती हैं: https://github.com/miguelgrinberg/Flask-SocketIO/blob/539cd158f49ce085151911cb63edbacd0fa37173/flask_socketio/init.py#L391-L408। यदि आप उन पंक्तियों के चारों ओर देखते हैं, तो आप देखेंगे कि कोड के तीन अलग-अलग भाग हैं, एक werkzeug के लिए, एक घटना के लिए और एक gevent के लिए। वे सभी अलग हैं।

+0

बढ़िया! 'Wsgi.server' कमांड पर फ्लास्क ऐप ऑब्जेक्ट को पास करने के लिए इवेंटलेट डॉक्स में उदाहरण से मुझे स्पष्ट नहीं था, इसलिए यह फ्लास्क-आधारित उदाहरण बहुत उपयोगी था। – Dirk

2
import eventlet 
eventlet.monkey_patch() 

जादुई एक multithread जानवर उस अनुरोध को अतुल्यकालिक रूप से संभाल कर सकते हैं में अपने कोड की बारी नहीं होगा (यह अभी भी बहुत जादुई और भयानक है)।

जैसा कि आप this example में देख सकते हैं, आपको eventlet wsgi's implementation का उपयोग कर wsgi सर्वर लॉन्च करने की आवश्यकता है।

यदि आप एक मानक समाधान चाहते हैं, तो फ्लास्क एप्लिकेशन लॉन्च करने के लिए nginx और uwsgi का उपयोग करने का तरीका देखें। आपको प्रोजेक्ट Spawning में रुचि हो सकती है जो एक पूर्ण मल्टीथ्रेड wsgi हैंडलर बनाने के दर्द का लाभ उठाती है।

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