स्थानीय फ्लास्क सर्वर पर धीमा अनुरोध


87

बस एक स्थानीय सर्वर पर फ्लास्क के साथ चारों ओर खेलना शुरू कर रहा हूं और मैं अनुरोध / प्रतिक्रिया समय को देख रहा हूं जो मुझे लगता है कि होना चाहिए की तुलना में धीमा है।

निम्नलिखित की तरह एक साधारण सर्वर प्रतिक्रिया देने के लिए 5 सेकंड के करीब लेता है।

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "index"

if __name__ == "__main__":
    app.run()

कोई विचार? या यह सिर्फ स्थानीय सर्वर कैसे है?


इसका स्थानीय सर्वर नहीं है, लेकिन इसका बैकग्राउंड में चल रहे अन्य अनुप्रयोगों के साथ क्या हो सकता है, आप इसे किस ओएस पर चला रहे हैं?
गाबियो

मैं OS X 10.7 पर i7 iMac
Meroon

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

2
@ मेरून का जवाब मेरे लिए सही था। हालाँकि, होस्ट सेटिंग्स बदलने के बजाय: क्या मैं लोकलहोस्ट के बजाय केवल 127.0.0.1 का उपयोग करने की सलाह दे सकता हूँ? सिस्टम कॉन्फ़िगरेशन को बदले बिना समस्या को हल किया।
डेविड बर्नाट

जवाबों:


93

ठीक है, मैंने पता लगा लिया। यह Werkzeug और OS के समर्थन वाले IPv6 के साथ एक समस्या प्रतीत होती है।

Werkzeug साइट से http://werkzeug.pocoo.org/docs/serves/ :

ऑपरेटिंग सिस्टम पर जो ipv6 का समर्थन करते हैं और इसे आधुनिक लिनक्स सिस्टम, ओएस एक्स 10.4 या उच्चतर के साथ-साथ विंडोज विस्टा के रूप में कॉन्फ़िगर किया गया है, यदि आपके स्थानीय सर्वर का उपयोग करते हुए कुछ ब्राउज़रों को धीमी गति से धीमा किया जा सकता है। इसका कारण यह है कि कभी-कभी "लोकलहोस्ट" को आईपीवी 4 और आईपीवी 6 सॉकेट्स पर उपलब्ध होने के लिए कॉन्फ़िगर किया गया है और कुछ ब्राउज़र पहले आईपीवी 6 और फिर ivp4 तक पहुंचने का प्रयास करेंगे।

तो यह फिक्स मेरी होस्ट फ़ाइल से निम्न पंक्ति को टिप्पणी करके स्थानीयहोस्ट से ipv6 को अक्षम करने के लिए है:

::1             localhost 

एक बार जब मैं ऐसा करता हूं तो विलंबता की समस्या दूर हो जाती है।

मैं वास्तव में फ्लास्क की खुदाई कर रहा हूं और मुझे खुशी है कि यह ढांचे के साथ कोई समस्या नहीं है। मुझे पता था कि यह नहीं हो सकता।



आपका बहुत बहुत धन्यवाद! अचानक देव परीक्षण तेज़ और उत्तरदायी है! मेरा एकमात्र सवाल: जैसा कि मैक होस्ट फ़ाइल इंगित करती है कि लोकलहोस्ट को हटाने से मेरे मैक के संचालन को प्रभावित किया जा सकता है, मुझे आश्चर्य है कि क्या यह इस पंक्ति का उल्लेख कर रहा है (या वह जो केवल लोकलहोस्ट को 127.0.0.1 पर रेखांकित करता है
डेविड बी।

मेजबानों की फाइल में मेरी विंडोज़ 10 प्रणाली पर दोनों प्रविष्टियाँ (ip4 और ip6) टिप्पणी की गई हैं; वे DNS सिस्टम द्वारा हल किए गए हैं। जब मैंने "लोकलहोस्ट" के बजाय "127.0.0.1" पर सर्वर चलाया तो मुझे एक बड़ी गति बढ़ गई (सरल कॉल के लिए 2.0 से 0.003 सेकंड तक)
लार्स

इस उत्तर के लिए धन्यवाद! हालाँकि मेरी स्थिति थोड़ी अलग थी (aiosmtpd के खिलाफ nose2 चल रहा है), आपके जवाब ने मुझे एक संकेत दिया: जब मैं अपने विंडोज 10 लैपटॉप पर IPv6 को अक्षम करता हूं तो 10x या 100x जैसी चीजों को गति देता है !!
पेपोलुआन

87

App.run () के तर्क के रूप में "पिरोया हुआ = सत्य" जोड़ें, जैसा कि यहाँ सुझाया गया है: http://arusahni.net/blog/2013/10/flask-multithreading.html

उदाहरण के लिए: app.run(host="0.0.0.0", port=8080, threaded=True)

IPv6- अक्षम करने वाले समाधान ने मेरे लिए काम नहीं किया, लेकिन यह किया।


5
पासिंग --threadedमेरे लिए manage.pyउपयोग कर Flask-Scriptभी काम किया।
स्नोरफॉर्पलागस

7
उन लोगों के लिए जो धागे को सक्षम करने से "निश्चित" हो जाते हैं, चेतावनी दी जाती है! इस मामले में देरी के कारण पिछले अनुरोध को ठीक से बंद नहीं किया गया था, इसलिए अब यह वास्तव में बहुत सारे थ्रेड को ढेर कर रहा है
kbtz

धन्‍यवाद, मेरे लोकलहोस्‍ट को धौंस जमाने के लिए धन्‍यवाद।
बेंजामिन

@snolflake: क्या यह जानने का कोई तरीका है कि क्या अनुरोधों को ठीक से बंद नहीं किया जा रहा है?
काइलोटन

1
कमांड लाइन से मैंने उपयोग किया flask run --with-threadsजिसने मेरी समस्या को हल किया ।
arno_v

13

@ साजिद-सिद्दीकी से समाधान तकनीकी रूप से सही है, लेकिन यह ध्यान रखें कि निर्मित डब्ल्यूएसजीआई सर्वर विर्कज़ग (जिसे फ्लास्क में पैक किया गया है और इसके लिए जो उपयोग करता है app.run()) केवल एकल-थ्रेडेड है।

बहु-थ्रेडेड व्यवहार को संभालने में सक्षम होने के लिए एक WSGI सर्वर स्थापित करें । मैंने विभिन्न WSGI सर्वर प्रदर्शनों पर अनुसंधान का एक गुच्छा किया । आपकी ज़रूरतें अलग-अलग हो सकती हैं, लेकिन यदि आप सभी का उपयोग कर रहे हैं तो फ्लास्क , तो मैं निम्नलिखित में से एक वेबसर्वर की सिफारिश करूंगा।

अद्यतन (2020/07/25): ऐसा लगता है कि gevent का समर्थन करना शुरू python3 5 साल पहले, कुछ ही समय बाद मैंने टिप्पणी की है कि यह, नहीं था तो आप उपयोग कर सकते हैं gevent अब।

gevent

आप स्थापित कर सकते हैं gevent के माध्यम से पिप कमांड के साथ pip install geventया pip3 कमांड के साथ pip3 install gevent। तदनुसार अपने कोड को संशोधित करने के निर्देश यहां दिए गए हैं: https://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#gevent

meinheld

gevent बेहतर है, लेकिन सभी बेंचमार्क से मैंने देखा है कि इसमें वास्तविक दुनिया का परीक्षण शामिल है, meinheld सबसे सीधा, सरल WSGI सर्वर लगता है। ( यदि आप कुछ और विन्यास को बुरा नहीं मानते हैं तो आप uWSGI पर भी नज़र डाल सकते हैं।)

तुम भी कमांड के साथ pip3 के माध्यम से meinheld स्थापित कर सकते हैं pip3 install meinheld। वहाँ से, फ्लास्क को एकीकृत करने के लिए meinheld स्रोत में दिए गए नमूने को देखें : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py

* नोट: PyCharm के मेरे उपयोग से , लाइन from meinheld import serverएक त्रुटि के रूप में हाइलाइट करती है, लेकिन सर्वर चलेगा, जिससे आप त्रुटि को अनदेखा कर सकते हैं।


फ्लास्क के साथ मुझे बड़ी प्रदर्शन समस्याएं थीं, यहां तक ​​कि सबसे सरल अनुरोधों को समाप्त करने के लिए लगभग 0.5s लग रहे थे। बस जीईवेंट पर स्विच किया गया और सब कुछ निर्दोष रूप से काम करता है, धन्यवाद!
गोनोस्तज

7

मेरी समस्या को "थ्रेडेड = ट्रू" द्वारा हल किया गया था, लेकिन मैं अपनी समस्या को दूसरों से अलग करने के लिए कुछ पृष्ठभूमि देना चाहता हूं जिसके लिए यह कर सकता है।

  1. पायथन 3 के साथ फ्लास्क चलाने पर केवल मेरा मुद्दा उठा। Python2 पर स्विच करना, मेरे पास अब यह मुद्दा नहीं था।
  2. Chrome के साथ एपीआई एक्सेस करते समय मेरी समस्या केवल उसी समय प्रकट हुई , जिस बिंदु पर, Chrome ने अपेक्षित स्क्रीन प्रदर्शित की, लेकिन जब तक मैं Chrome टैब को पुनः लोड या बंद नहीं कर देता, तब तक बाकी सब कुछ लटका (कर्ल, एफएक्सएक्स आदि)। परिणाम वापस आ गया।

मेरा सबसे अच्छा अनुमान है कि क्रोम सत्र को खुला रखने की कोशिश कर रहा था और फ्लास्क बाद के अनुरोधों को रोक रहा था। जैसे ही क्रोम से कनेक्शन बंद या रीसेट किया गया, बाकी सब कुछ संसाधित हो गया।

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


6

http://localhost:port/endpointकॉल करने के बजाए http://127.0.0.1:port/endpoint। इसने मेरे लिए शुरुआती 500ms देरी को हटा दिया।


मेरे लिए इसने 3 सेकेंड की तरह कुछ हटा दिया (मैं फॉर्म 0.0.0.0 से 127.0.0.1 तक चला गया)। क्या कोई समझा सकता है कि यह क्यों और कैसे काम करता है?
रोटकीव

देवताओं में यह काम क्यों होता है? 2.06 सेकंड से 0.002 सेकंड तक चला गया। ब्राउज़र समस्या के बिना लोकलहोस्ट का उपयोग करने में सक्षम है, लेकिन अनुरोध करने के लिए लोकलहोस्ट पर 2 सेकंड लगते हैं।
एक्सवियन

4

threaded=Trueमेरे लिए काम करता है, लेकिन अंत में मुझे पता चला कि यह मुद्दा फ़ायरफ़ॉक्स पर फॉक्सिप्रोक्सी के कारण है। जब से फ्लास्क ऐप लोकलहोस्ट पर चल रहा है, धीमी गति से प्रतिक्रिया होती है

  • foxyproxy फ़ायरफ़ॉक्स पर सक्षम है

धीमी प्रतिक्रिया नहीं होगी अगर

  • foxyproxy फ़ायरफ़ॉक्स पर अक्षम है

  • अन्य ब्राउज़रों का उपयोग करके वेबसाइट तक पहुँचें

एकमात्र समाधान जो मैंने पाया है वह है फॉक्सिप्रोक्सी को निष्क्रिय करना, स्थानीय ब्लैकहैड को प्रॉक्सी ब्लैकलिस्ट और ट्वीक सेटिंग्स में जोड़ने की कोशिश की लेकिन उनमें से किसी ने भी काम नहीं किया।


2

मैंने अपने मुद्दे को हल करने के लिए मिहेको की प्रतिक्रिया का इस्तेमाल किया।

::1 localhostमेरी मेजबानों फ़ाइल पर पहले ही टिप्पणी कर दी गई थी, और सेटिंग Threaded=trueने मेरे लिए काम नहीं किया। प्रत्येक REST अनुरोध तत्काल होने के बजाय प्रक्रिया में 1 सेकंड ले रहा था।

मैं अजगर 3.6 का उपयोग कर रहा हूं, और मैं फ्लास्क का उपयोग करके इसके WSGI के रूप में फ्लास्क का उपयोग करके REST अनुरोधों के लिए तेज और उत्तरदायी बन गया।

जियोवेंट का उपयोग करने के लिए, इसे स्थापित करें pip install gevent

बाद में, मैंने https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 का उपयोग करके जिप का उपयोग करने के लिए फ्लास्क सेट किया।

लिंक को नीचे ले जाएं, यहाँ स्क्रिप्ट के महत्वपूर्ण भाग हैं:

from flask import Flask, Response
from gevent.pywsgi import WSGIServer
from gevent import monkey

# need to patch sockets to make requests async
# you may also need to call this before importing other packages that setup ssl
monkey.patch_all()

app = Flask(__name__) 


# define some REST endpoints... 

def main():

    # use gevent WSGI server instead of the Flask
    # instead of 5000, you can define whatever port you want.
    http = WSGIServer(('', 5000), app.wsgi_app) 

    # Serve your application
    http.serve_forever()


if __name__ == '__main__':
    main()

थ्रेडेड = सच काम नहीं कर रहा है (अजगर 3.6.7 और पोस्टमैन का उपयोग करके), मुझे वर्जनऑनफ्लिक्ट मिल रहा है: (ग्रीनलेट 0.4.13 (c: \ anaconda3 \ lib \ साइट-पैकेज), आवश्यकता.परसे ('ग्रीनलेट> = 0.4)। 14; platform_python_implementation == "CPython" ')), क्या मुझे पता है कि इसे कैसे हल किया जाए, धन्यवाद
hanzgs

0

मेजबान के localhostरूप में अच्छी तरह से अन्य पर चल रहा है जब मुझे यह त्रुटि मिली , तो कुछ के लिए, विभिन्न अंतर्निहित समस्याओं में समान लक्षण प्रदर्शित हो सकते हैं।

मैंने ज्यादातर चीजें जो मैं टोरनेडो के लिए उपयोग कर रहा हूं, स्विच किया, और यह एक राशि है। मेरे पास कुछ धीमा पृष्ठ लोड है, लेकिन चीजें आम तौर पर अधिक संवेदनशील लगती हैं। इसके अलावा, बहुत ही महत्वपूर्ण है, लेकिन मुझे लगता है कि अकेले फ्लास्क समय के साथ धीमा हो जाएगा, लेकिन फ्लास्क + तूफान कम लगता है। मैं अपाचे का उपयोग करने की कल्पना करता हूं और mod_wsgiचीजों को और भी बेहतर बनाऊंगा, लेकिन टॉरनेडो को स्थापित करने के लिए वास्तव में सरल है (देखें http://flask.pocoo.org/docs/deploying/others/ )।

(इसके अलावा, एक संबंधित प्रश्न: फ्लास्क एप्लिकेशन कभी-कभी लटका हुआ है )


0

मेरा यहाँ एक अलग समाधान था। मैंने .pycसर्वर की निर्देशिका से सभी को हटा दिया और इसे फिर से शुरू किया। वैसे, मेरे होस्ट फ़ाइल (विंडोज 8) में लोकलहोस्ट की टिप्पणी पहले ही की जा चुकी थी।

सर्वर पूरे समय फ्रीज था और अब यह फिर से ठीक काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.