คำขอช้าบน Local Flask Server


87

เพิ่งเริ่มเล่นกับ Flask บนเซิร์ฟเวอร์ท้องถิ่นและฉันสังเกตเห็นว่าเวลาในการร้องขอ / ตอบกลับช้ากว่าที่ฉันคิดว่าควรจะเป็น

เพียงแค่เซิร์ฟเวอร์ธรรมดาดังต่อไปนี้ใช้เวลาเกือบ 5 วินาทีในการตอบสนอง

from flask import Flask

app = Flask(__name__)

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

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

ความคิดใด ๆ ? หรือนี่เป็นเพียงเซิร์ฟเวอร์ภายใน?


ไม่ใช่เซิร์ฟเวอร์ภายใน แต่อาจเกี่ยวข้องกับแอปพลิเคชันอื่น ๆ ที่ทำงานอยู่เบื้องหลังระบบปฏิบัติการใดที่คุณใช้งานอยู่
gabeio

ฉันใช้ OS X 10.7 บน iMac i7
Meroon

1
มันไม่ควรจะใช้เวลานี้มานานสำหรับการตอบสนองของคุณ แต่ฉันมี messed จริงรอบกับขวดก่อนที่จะไปสู่ความสำเร็จผมจะแนะนำให้ไม่มีBottlepy แม้ว่าจะยังคงตรวจสอบกระบวนการเบื้องหลังของคุณ แต่คุณอาจมีเซิร์ฟเวอร์เวอร์ชันเก่าที่ทำงานอยู่เบื้องหลังเข้ามายึดครองหลามของคุณและทำให้การตอบสนองช้า นอกจากนี้ยังอาจเป็นเบราว์เซอร์ของคุณสิ่งนี้เกิดขึ้นใน Chrome & Safari?
gabeio

2
คำตอบของ @ Meroon ถูกต้องสำหรับฉัน แทนที่จะเปลี่ยนการตั้งค่าโฮสต์: ฉันขอแนะนำให้ใช้ 127.0.0.1 แทน localhost หรือไม่? ซึ่งช่วยแก้ปัญหาได้โดยไม่ต้องเปลี่ยนการกำหนดค่าระบบ
David Bernat

คำตอบ:


94

ตกลงฉันคิดออกแล้ว ดูเหมือนว่าจะเป็นปัญหากับ Werkzeug และระบบปฏิบัติการที่รองรับ ipv6

จากเว็บไซต์ Werkzeug http://werkzeug.pocoo.org/docs/serves/ :

บนระบบปฏิบัติการที่รองรับ ipv6 และกำหนดค่าไว้เช่นระบบ Linux ที่ทันสมัย ​​OS X 10.4 ขึ้นไปรวมถึง Windows Vista เบราว์เซอร์บางตัวอาจทำงานช้าลงอย่างเจ็บปวดหากเข้าถึงเซิร์ฟเวอร์ภายในของคุณ สาเหตุนี้คือบางครั้ง "localhost" ถูกกำหนดค่าให้พร้อมใช้งานบนถุงเท้าทั้ง ipv4 และ ipv6 และเบราว์เซอร์บางตัวจะพยายามเข้าถึง ipv6 ก่อนแล้วจึง ivp4

ดังนั้นการแก้ไขคือปิดการใช้งาน ipv6 จาก localhost โดยแสดงความคิดเห็นในบรรทัดต่อไปนี้จากไฟล์โฮสต์ของฉัน:

::1             localhost 

เมื่อฉันทำสิ่งนี้ปัญหาเวลาแฝงจะหายไป

ฉันกำลังขุด Flask จริงๆและฉันดีใจที่ไม่เป็นปัญหากับเฟรมเวิร์ก ฉันรู้ว่ามันเป็นไปไม่ได้


2
ฉันพบว่ามีประโยชน์เหล่านี้: Windows techunboxed.com/2012/08/how-to-disable-ipv6-in-windows-8.html Ubuntu noobslab.com/2012/05/disable-ipv6-if-your-internet-is html
Larry Eitel

ขอบคุณมาก! ทันใดนั้นการทดสอบ dev ก็เร็วและตอบสนอง! คำถามเดียวของฉัน: เนื่องจากไฟล์โฮสต์ Mac ระบุว่าการลบ localhost อาจส่งผลกระทบต่อการทำงานของ Mac ของฉันฉันสงสัยว่ามันอ้างถึงบรรทัดนี้หรือไม่ (หรือที่ระบุตำแหน่ง localhost ไปที่ 127.0.0.1
David B.

บนระบบ windows 10 ของฉันในไฟล์โฮสต์ทั้งสองรายการ (ip4 และ ip6) ถูกแสดงความคิดเห็น ได้รับการแก้ไขโดยระบบ DNS ฉันได้รับความเร็วเพิ่มขึ้นอย่างมากเมื่อฉันรันเซิร์ฟเวอร์บน "127.0.0.1" แทนที่จะเป็น "localhost" (จาก 2.0 เป็น 0.003 วินาทีสำหรับการโทรธรรมดา)
Lars

ขอบคุณสำหรับคำตอบนี้! แม้ว่าสถานการณ์ของฉันจะแตกต่างกันเล็กน้อย (ใช้ nose2 เทียบกับ aiosmtpd) คำตอบของคุณให้คำแนะนำแก่ฉัน: เมื่อฉันปิดใช้งาน IPv6บนแล็ปท็อป Windows 10 ของฉันจะเร่งความเร็วสิ่งต่างๆเช่น 10x หรือ 100x
pepoluan

91

เพิ่ม "threaded = True" เป็นอาร์กิวเมนต์ให้กับ 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งานของฉันเกินไป
Snorfalorpagus

7
สำหรับผู้ที่ได้รับ "แก้ไข" โดยการเปิดใช้งานเธรดได้รับการเตือน! ในกรณีนี้ความล่าช้าที่เกิดจากการร้องขอก่อนหน้านี้ไม่ได้ถูกปิดอย่างถูกต้องดังนั้นตอนนี้มันเป็นจริงเพียงแค่ซ้อนจำนวนมากของกระทู้
kbtz

1
ขอบคุณที่ทำให้ localhost ของฉันทำงานได้อย่างรวดเร็ว
benjaminz

@snolflake: มีวิธีที่จะทราบได้หรือไม่ว่าคำขอไม่ถูกปิดอย่างถูกต้อง?
Kylotan

1
จากบรรทัดคำสั่งฉันใช้flask run --with-threadsซึ่งช่วยแก้ปัญหาของฉันได้
arno_v

13

วิธีแก้ปัญหาจาก @ sajid-siddiqi นั้นถูกต้องในทางเทคนิค แต่โปรดทราบว่าเซิร์ฟเวอร์WSGIในตัวในWerkzeug (ซึ่งบรรจุลงในFlaskและสิ่งที่ใช้สำหรับapp.run()) เป็นเพียงเธรดเดียวเท่านั้น

ติดตั้งเซิร์ฟเวอร์WSGIเพื่อให้สามารถจัดการกับลักษณะการทำงานแบบมัลติเธรด ฉันทำการวิจัยมากมายเกี่ยวกับประสิทธิภาพของเซิร์ฟเวอร์WSGI ความต้องการของคุณอาจแตกต่างกันไป แต่ถ้าทั้งหมดที่คุณใช้คือFlaskฉันขอแนะนำเว็บเซิร์ฟเวอร์ต่อไปนี้

อัปเดต (2020-07-25): ดูเหมือนว่าgeventเริ่มรองรับpython3 เมื่อ 5 ปีก่อนไม่นานหลังจากที่ฉันแสดงความคิดเห็นว่ามันไม่ได้ดังนั้นคุณสามารถใช้gevent ได้ในตอนนี้

gevent

คุณสามารถติดตั้งgeventผ่านpipมีคำสั่งpip install geventหรือpip3pip3 install geventกับคำสั่ง คำแนะนำในการแก้ไขโค้ดของคุณมีอยู่ที่นี่: https://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#gevent

meinheld

geventดีกว่า แต่จากเกณฑ์มาตรฐานทั้งหมดที่ฉันได้ดูซึ่งเกี่ยวข้องกับการทดสอบในโลกแห่งความเป็นจริงmeinheldดูเหมือนจะเป็นเซิร์ฟเวอร์WSGI ที่ง่ายและตรงไปตรงมาที่สุด (คุณสามารถดูuWSGI ได้หากคุณไม่สนใจการกำหนดค่าเพิ่มเติม)

นอกจากนี้คุณยังสามารถติดตั้งmeinheldผ่านpip3pip3 install meinheldกับคำสั่ง จากนั้นดูตัวอย่างที่ให้ไว้ในแหล่งที่มาของmeinheldเพื่อรวมFlask : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py

* หมายเหตุ: จากการใช้PyCharmของฉันบรรทัดจะfrom meinheld import serverเน้นว่าเป็นข้อผิดพลาด แต่เซิร์ฟเวอร์จะทำงานดังนั้นคุณจึงไม่สนใจข้อผิดพลาด


ฉันมีปัญหาด้านประสิทธิภาพที่สำคัญกับ Flask แม้แต่คำขอที่ง่ายที่สุดก็ใช้เวลาประมาณ 0.5 วินาทีจึงจะเสร็จสิ้น เพิ่งเปลี่ยนมาใช้ gevent และทุกอย่างทำงานได้อย่างไม่มีที่ติขอบคุณ!
gronostaj

7

แทนการโทรโทรhttp://localhost:port/endpoint http://127.0.0.1:port/endpointสิ่งนี้ลบความล่าช้า 500ms เริ่มต้นสำหรับฉัน


สำหรับฉันมันลบบางอย่างเช่น 3 วินาที (ฉันย้ายแบบฟอร์ม 0.0.0.0 ถึง 127.0.0.1) ใครสามารถอธิบายได้ว่าทำไมและทำงานอย่างไร
Rotkiv

ทำไมในชื่อเทพเจ้าถึงใช้งานได้? เปลี่ยนจาก 2.06 วินาทีเป็น 0.002 วินาที เบราว์เซอร์สามารถใช้ localhost ได้โดยไม่มีปัญหา แต่ request.get บน localhost ใช้เวลา 2 วินาทีในการแก้ไข
Xevion

7

ปัญหาของฉันได้รับการแก้ไขโดย "threaded = True" แต่ฉันต้องการให้ข้อมูลพื้นฐานเพื่อแยกปัญหาของฉันออกจากปัญหาอื่นซึ่งอาจไม่สามารถทำได้

  1. ปัญหาของฉันเกิดขึ้นเมื่อเรียกใช้ Flask ด้วย python3 เท่านั้น เปลี่ยนไปใช้ python2 ฉันไม่มีปัญหานี้อีกต่อไป
  2. ปัญหาของฉันปรากฏเฉพาะเมื่อเข้าถึง api ด้วย Chrome ณ จุดนั้น Chrome จะแสดงหน้าจอที่คาดไว้ แต่ทุกอย่างจะหยุดทำงาน (curl, ffx ฯลฯ ) จนกว่าฉันจะโหลดใหม่หรือปิดแท็บ Chrome เมื่อถึงจุดนั้นทุกอย่างที่รออยู่ รอบส่งคืนผลลัพธ์

ฉันเดาได้ดีที่สุดคือ Chrome พยายามเปิดเซสชันไว้และ Flask บล็อกคำขอที่ตามมา ทันทีที่หยุดหรือรีเซ็ตการเชื่อมต่อจาก Chrome ทุกอย่างจะถูกประมวลผล

ในกรณีของฉันเธรดได้รับการแก้ไขแล้ว แน่นอนว่าตอนนี้ฉันกำลังดูลิงก์ที่คนอื่นให้ไว้เพื่อให้แน่ใจว่าจะไม่ก่อให้เกิดปัญหาอื่น


4

threaded=Trueได้ผลสำหรับฉัน แต่ในที่สุดฉันก็พบว่าปัญหาเกิดจาก foxyproxy บน firefox เนื่องจากเมื่อแอป flask ทำงานบน localhost การตอบสนองช้าจะเกิดขึ้นหาก

  • foxyproxy ถูกเปิดใช้งานบน firefox

การตอบสนองช้าจะไม่เกิดขึ้นหาก

  • foxyproxy ถูกปิดใช้งานบน firefox

  • เข้าถึงเว็บไซต์โดยใช้เบราว์เซอร์อื่น

ทางออกเดียวที่ฉันพบคือปิดการใช้งาน foxyproxy พยายามเพิ่ม localhost ในบัญชีดำของพร็อกซีและปรับแต่งการตั้งค่า แต่ไม่ได้ผล


2

ฉันใช้คำตอบของ Miheko เพื่อแก้ปัญหาของฉัน

::1 localhostแสดงความคิดเห็นในไฟล์โฮสต์ของฉันแล้วและการตั้งค่าThreaded=trueไม่ได้ผลสำหรับฉัน ทุกคำขอ REST ใช้เวลา 1 วินาทีในการดำเนินการแทนที่จะเป็นแบบทันที

ฉันใช้ python 3.6 และฉันได้รับขวดที่รวดเร็วและตอบสนองต่อคำขอ REST โดยการทำให้ขวดใช้ gevent เป็น WSGI

ในการใช้ gevent ให้ติดตั้งด้วย pip install gevent

หลังจากนั้นฉันใช้https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41เพื่อตั้งค่าขวดให้ใช้ gevent

ในกรณีที่ลิงก์ลงไปนี่คือส่วนสำคัญของสคริปต์:

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()

threaded = True ไม่ทำงานสำหรับ (ใช้ python 3.6.7 และบุรุษไปรษณีย์) ฉันได้รับ VersionConflict: (greenlet 0.4.13 (c: \ anaconda3 \ lib \ site-Packages), Requirement.parse ('greenlet> = 0.4 14; platform_python_implementation == "CPython" ')) ฉันขอทราบวิธีแก้ปัญหานี้ได้ไหมขอบคุณ
hanzgs

0

ฉันได้รับข้อผิดพลาดนี้เมื่อทำงานบนโฮสต์อื่นที่ไม่ใช่localhostเช่นกันดังนั้นสำหรับบางคนปัญหาพื้นฐานที่แตกต่างกันอาจแสดงอาการเดียวกัน

ฉันเปลี่ยนของส่วนใหญ่ที่ฉันเคยใช้กับ Tornado และมันช่วยได้มาก ฉันโหลดหน้าเว็บช้าไปบ้าง แต่โดยทั่วไปแล้วดูเหมือนว่าจะตอบสนองมากกว่า นอกจากนี้ยังมีประวัติเล็กน้อย แต่ฉันสังเกตเห็นว่า Flask เพียงอย่างเดียวจะช้าลงเมื่อเวลาผ่านไป แต่ Flask + Tornado น้อยกว่านั้น ฉันจินตนาการว่าใช้ Apache และmod_wsgiจะทำให้สิ่งต่างๆดียิ่งขึ้น แต่ Tornado นั้นง่ายมากในการตั้งค่า (ดูhttp://flask.pocoo.org/docs/deploying/others/ )

(นอกจากนี้คำถามที่เกี่ยวข้อง: แอปกระติกน้ำหยุดทำงานเป็นครั้งคราว )


0

ฉันมีทางออกอื่นที่นี่ ฉันเพิ่งลบทั้งหมด.pycออกจากไดเรกทอรีของเซิร์ฟเวอร์และเริ่มต้นใหม่อีกครั้ง อย่างไรก็ตาม localhost ได้แสดงความคิดเห็นในไฟล์โฮสต์ของฉันแล้ว (Windows 8)

เซิร์ฟเวอร์หยุดทำงานตลอดเวลาและตอนนี้ก็ทำงานได้ดีอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.