Yêu cầu chậm trên máy chủ lưu trữ cục bộ


87

Chỉ mới bắt đầu chơi với Flask trên một máy chủ cục bộ và tôi nhận thấy thời gian yêu cầu / phản hồi chậm hơn tôi cảm thấy.

Chỉ cần một máy chủ đơn giản như sau mất gần 5 giây để phản hồi.

from flask import Flask

app = Flask(__name__)

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

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

Có ý kiến ​​gì không? Hay đây chỉ là cách máy chủ cục bộ?


Nó không phải là máy chủ cục bộ nhưng nó có thể liên quan đến các ứng dụng khác đang chạy ở chế độ nền mà bạn đang chạy nó trên hệ điều hành nào?
gabeio

Tôi đang chạy trên OS X 10.7 trên iMac i7
Meroon

1
Sẽ không mất nhiều thời gian cho câu trả lời của bạn nhưng tôi thực sự đã làm lộn xộn với bình trước đó và không thành công, tôi sẽ khuyên Bottlepy . Mặc dù vẫn kiểm tra các quy trình nền của bạn, bạn có thể có một phiên bản cũ hơn của máy chủ đang chạy trong nền chiếm lấy python của bạn và gây ra phản hồi chậm. Ngoài ra nó có thể là trình duyệt của bạn điều này xảy ra trong chrome & safari?
gabeio

2
Câu trả lời của @ Meroon là chính xác đối với tôi. Tuy nhiên, thay vì thay đổi cài đặt máy chủ lưu trữ: Tôi có thể khuyên bạn chỉ cần sử dụng 127.0.0.1 thay vì localhost? Điều đó đã giải quyết được vấn đề mà không cần thay đổi cấu hình hệ thống.
David Bernat

Câu trả lời:


93

Ok, tôi đã tìm ra. Có vẻ như có vấn đề với Werkzeug và hệ điều hành hỗ trợ ipv6.

Từ trang Werkzeug http://werkzeug.pocoo.org/docs/serving/ :

Trên các hệ điều hành hỗ trợ ipv6 và đã được định cấu hình như hệ thống Linux hiện đại, OS X 10.4 trở lên cũng như Windows Vista, một số trình duyệt có thể rất chậm nếu truy cập vào máy chủ cục bộ của bạn. Lý do cho điều này là đôi khi “localhost” được định cấu hình để có sẵn trên cả ipv4 và ipv6 socktes và một số trình duyệt sẽ cố gắng truy cập ipv6 trước rồi đến ivp4.

Vì vậy, cách khắc phục là vô hiệu hóa ipv6 từ localhost bằng cách nhận xét dòng sau từ tệp máy chủ của tôi:

::1             localhost 

Khi tôi làm điều này, các vấn đề về độ trễ sẽ biến mất.

Tôi thực sự đang đào Flask và tôi rất vui vì nó không phải là vấn đề với khuôn khổ. Tôi biết nó không thể được.



cảm ơn rất nhiều! đột nhiên thử nghiệm nhà phát triển nhanh và nhạy! Câu hỏi duy nhất của tôi: như các host Mac tập tin chỉ ra rằng việc loại bỏ localhost có thể ảnh hưởng đến hoạt động máy Mac của tôi, tôi tự hỏi liệu nó được đề cập đến dòng này (hoặc một trong đó chỉ đơn giản là nằm localhost để 127.0.0.1
David B.

trên hệ thống windows 10 của tôi trong tệp máy chủ, cả hai mục nhập (ip4 và ip6) đều bị nhận xét; chúng được phân giải bởi hệ thống DNS. Tôi đã tăng tốc độ rất lớn khi chạy máy chủ trên "127.0.0.1" thay vì "localhost" (từ 2,0 lên 0,003 giây cho các cuộc gọi đơn giản)
Lars

Cảm ơn bạn vì câu trả lời này! Mặc dù tình huống của tôi hơi khác (chạy mũi2 với aiosmtpd), câu trả lời của bạn đã cho tôi một gợi ý: Khi tôi tắt IPv6 trên máy tính xách tay Windows 10 của mình, tốc độ những thứ như 10x hoặc 100x !!
pepoluan

87

Thêm "threaded = True" làm đối số cho app.run (), như được đề xuất tại đây: http://arusahni.net/blog/2013/10/flask-multithreading.html

Ví dụ: app.run(host="0.0.0.0", port=8080, threaded=True)

Giải pháp vô hiệu hóa ipv6 không hoạt động với tôi, nhưng điều này đã làm được.


5
Chuyển --threadedsang manage.pysử dụng của tôi Flask-Scriptcũng hoạt động.
Snorfalorpagus

7
Đối với những người nhận được nó "sửa chữa" bằng cách kích hoạt các chủ đề, hãy cảnh báo! Trong trường hợp này, sự chậm trễ là do yêu cầu trước đó không được đóng đúng cách, vì vậy bây giờ nó thực sự chỉ là xếp chồng rất nhiều luồng .
kbtz

Cảm ơn bạn đã làm cho localhost của tôi chạy nhanh như vũ bão.
benjaminz

@snolflake: Có cách nào để biết liệu các yêu cầu không được đóng đúng cách không?
Kylotan

1
Từ dòng lệnh tôi đã sử dụng flask run --with-threadsđã giải quyết được vấn đề của tôi.
arno_v

13

Giải pháp từ @ sajid-siddiqi là đúng về mặt kỹ thuật, nhưng hãy nhớ rằng máy chủ WSGI tích hợp trong Werkzeug (được đóng gói thành Flask và nó dùng để làm gì app.run()) chỉ là một luồng.

Cài đặt máy chủ WSGI để có thể xử lý hành vi đa luồng. Tôi đã thực hiện một loạt nghiên cứu về các hiệu suất máy chủ WSGI khác nhau . Nhu cầu của bạn có thể khác nhau, nhưng nếu tất cả những gì bạn đang sử dụng là Flask , thì tôi khuyên bạn nên sử dụng một trong những máy chủ web sau.

Cập nhật (2020-07-25): Có vẻ như gevent đã bắt đầu hỗ trợ python3 cách đây 5 năm, ngay sau khi tôi nhận xét là không, vì vậy bạn có thể sử dụng gevent ngay bây giờ.

gevent

Bạn có thể cài đặt gevent thông qua pip bằng lệnh pip install geventhoặc pip3 bằng lệnh pip3 install gevent. Hướng dẫn về cách sửa đổi mã của bạn cho phù hợp ở đây: https://flask.palletsprojects.com/en/1.1.x/deploy/wsgi-standalone/#gevent

meinheld

gevent tốt hơn, nhưng từ tất cả các tiêu chuẩn mà tôi đã xem xét liên quan đến thử nghiệm trong thế giới thực, meinheld có vẻ là máy chủ WSGI đơn giản, dễ hiểu nhất . (Bạn cũng có thể xem qua uWSGI nếu bạn không ngại một số cấu hình khác.)

Bạn cũng có thể cài đặt meinheld thông qua pip3 bằng lệnh pip3 install meinheld. Từ đó, hãy xem mẫu được cung cấp trong nguồn meinheld để tích hợp Flask : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py

* LƯU Ý: Từ việc sử dụng PyCharm của tôi , dòng này from meinheld import servernổi bật là lỗi, nhưng máy chủ sẽ chạy, vì vậy bạn có thể bỏ qua lỗi.


Tôi đã gặp vấn đề về hiệu suất lớn với Flask, ngay cả những yêu cầu đơn giản nhất cũng mất khoảng 0,5 giây để hoàn thành. Chỉ cần chuyển sang gevent và mọi thứ hoạt động hoàn hảo, cảm ơn bạn!
gronostaj

7

Thay vì gọi http://localhost:port/endpointcuộc gọi http://127.0.0.1:port/endpoint. Điều này đã loại bỏ độ trễ 500ms ban đầu cho tôi.


đối với tôi, nó đã xóa một cái gì đó giống như 3 giây (tôi đã chuyển biểu mẫu 0.0.0.0 sang 127.0.0.1). Ai đó có thể giải thích tại sao và làm thế nào nó hoạt động?
Rotkiv

Tại sao trong tên các vị thần lại làm việc này? Đi từ 2,06 giây xuống 0,002 giây. Trình duyệt có thể sử dụng localhost mà không gặp sự cố, nhưng request.get trên localhost mất 2 giây để giải quyết.
Xevion

7

Vấn đề của tôi đã được giải quyết bằng "threaded = True", nhưng tôi muốn cung cấp một số thông tin cơ bản để phân biệt vấn đề của tôi với những vấn đề khác mà điều này có thể không làm được.

  1. Vấn đề của tôi chỉ phát sinh khi chạy Flask với python3. Chuyển sang python2, tôi không còn gặp sự cố này nữa.
  2. Sự cố của tôi chỉ xuất hiện khi truy cập api bằng Chrome, tại thời điểm đó, Chrome hiển thị màn hình mong đợi, nhưng mọi thứ khác bị treo (curl, ffx, v.v.) cho đến khi tôi tải lại hoặc đóng tab Chrome, tại thời điểm này, mọi thứ khác đang chờ xung quanh trả lại một kết quả.

Dự đoán tốt nhất của tôi là Chrome đang cố gắng giữ phiên mở và Flask đang chặn các yêu cầu tiếp theo. Ngay sau khi kết nối từ Chrome bị dừng hoặc đặt lại, mọi thứ khác đã được xử lý.

Trong trường hợp của tôi, luồng đã khắc phục nó. Tất nhiên, bây giờ tôi đang xem qua một số liên kết mà những người khác đã cung cấp để đảm bảo rằng nó sẽ không gây ra bất kỳ vấn đề nào khác.


4

threaded=Truephù hợp với tôi, nhưng cuối cùng tôi đã phát hiện ra rằng vấn đề là do foxyproxy trên firefox. Vì khi ứng dụng flask đang chạy trên localhost, phản hồi chậm sẽ xảy ra nếu

  • foxyproxy được bật trên firefox

phản hồi chậm sẽ không xảy ra nếu

  • foxyproxy bị tắt trên firefox

  • truy cập trang web bằng các trình duyệt khác

Giải pháp duy nhất tôi tìm thấy là vô hiệu hóa foxyproxy, cố gắng thêm localhost vào danh sách đen proxy và chỉnh sửa cài đặt nhưng không có cách nào trong số chúng hoạt động.


2

Tôi đã sử dụng phản hồi của Miheko để giải quyết vấn đề của mình.

::1 localhostđã được nhận xét về tệp máy chủ của tôi và cài đặt Threaded=truekhông hoạt động với tôi. Mỗi yêu cầu REST mất 1 giây để xử lý thay vì ngay lập tức.

Tôi đang sử dụng python 3.6 và tôi nhận thấy flask nhanh chóng và đáp ứng các yêu cầu REST bằng cách làm cho flask sử dụng gevent làm WSGI của nó.

Để sử dụng gevent, hãy cài đặt nó với pip install gevent

Sau đó, tôi đã sử dụng https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 để đặt bình để sử dụng gevent.

Trong trường hợp liên kết gặp trục trặc, đây là các phần quan trọng của tập lệnh:

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 không hoạt động cho (sử dụng python 3.6.7 và người đưa thư), tôi đang nhận được VersionConflict: (greenlet 0.4.13 (c: \ anaconda3 \ lib \ site-pack), Requiment.parse ('greenlet> = 0.4. 14; platform_python_implementation == "CPython" ')), tôi có thể biết làm thế nào để giải quyết này, Cảm ơn
hanzgs

0

Tôi cũng gặp phải lỗi này khi chạy trên các máy chủ khác localhost, vì vậy đối với một số vấn đề cơ bản khác nhau có thể biểu hiện các triệu chứng giống nhau.

Tôi đã chuyển hầu hết những thứ tôi đang sử dụng sang Tornado, và theo giai thoại thì nó đã giúp ích một phần. Tôi có một vài lần tải trang chậm, nhưng mọi thứ nhìn chung có vẻ nhanh nhạy hơn. Ngoài ra, rất giai thoại, nhưng tôi có vẻ nhận thấy rằng một mình Flask sẽ chậm lại theo thời gian, nhưng Flask + Tornado thì ít hơn. Tôi tưởng tượng sử dụng Apache và mod_wsgisẽ làm mọi thứ tốt hơn, nhưng Tornado thực sự đơn giản để thiết lập (xem http://flask.pocoo.org/docs/deploy/others/ ).

(Ngoài ra, một câu hỏi liên quan: Ứng dụng Flask thỉnh thoảng bị treo )


0

Tôi đã có một giải pháp khác ở đây. Tôi vừa xóa tất cả .pyckhỏi thư mục của máy chủ và bắt đầu lại. Nhân tiện, localhost đã được nhận xét trong tệp máy chủ của tôi (Windows 8).

Máy chủ đã bị đóng băng toàn bộ thời gian và bây giờ nó hoạt động tốt trở lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.