2012-11-22 16 views
23

Tôi đang viết ứng dụng bình chứa chấp nhận yêu cầu POST với dữ liệu json. Tôi nhận thấy sự khác biệt rất lớn trong thời gian phản hồi dựa trên kích thước dữ liệu được chuyển đến ứng dụng. Sau khi gỡ lỗi tôi thu hẹp vấn đề xuống dòng mà tôi đã lấy dữ liệu json từ đối tượng yêu cầu. Nó có thể là quan trọng cần lưu ý rằng thử nghiệm đã được thực hiện trên máy chủ phát triển bình.Flask chậm khi truy xuất dữ liệu bài đăng theo yêu cầu?

start = time.time() 
resp = json.dumps(request.json) 
return str(time.time() - start) 

Tôi đã hẹn giờ dòng này và dữ liệu 1024 (có thể không phải ngẫu nhiên) và ít ký tự hơn 0,002 và cho bất kỳ thứ gì vượt quá 1024 trong 1 giây! Điều gì đang xảy ra ở đây? Đây có phải là giới hạn của máy chủ phát triển không?

EDIT: Cùng một điều sẽ xảy ra để lấy dữ liệu POST qua request.form.get ('somedata') với nội dung chiều dài trên 1024

EDIT: tôi không thể tái tạo vấn đề với cùng một ví dụ phục vụ bởi Apache

EDIT: Tôi bắt đầu đào sâu vào mô-đun Werkzeug và thấy rằng sự chậm chạp xảy ra khi đọc thư trả lời self._read(to_read) trong mô-đun wsgi.py được truyền từ BaseHTTPRequestHandler. Vẫn không biết tại sao quá chậm.


chi tiết môi trường Dưới đây là: Ubuntu - 10,04 Python - 2.6.5 Flask - 0,9 Werkzeug - máy chủ phát triển 0.8.3

+0

Có thể có liên quan? http://stackoverflow.com/questions/11150343/slow-requests-on-local-flask-server – barracel

+0

barracel đây không phải là nó. –

+3

Bạn có thể sao chép điều này với bất kỳ máy chủ WSGI độc lập nào khác không?chẳng hạn như gunicorn, Tornado, ... xem http://flask.pocoo.org/docs/deploying/wsgi-standalone/ –

Trả lời

4

Các bình dự kiến ​​sẽ chậm. Từ http://flask.pocoo.org/docs/deploying/:

Bạn có thể sử dụng máy chủ được xây dựng trong quá trình phát triển, nhưng bạn nên sử dụng tùy chọn triển khai đầy đủ cho các ứng dụng sản xuất. (Không sử dụng máy chủ phát triển nội bộ trong quá trình sản xuất.)

01 Máy chủ WSGI như gunicorn hoặc lốc xoáy sẽ nhanh hơn và đáng tin cậy hơn, vì vậy hãy sử dụng một trong số đó để triển khai và đo điểm chuẩn .

Nếu bạn lo lắng về việc làm việc nhanh chóng trong quá trình phát triển, bạn có thể sử dụng gunicorn trong quá trình phát triển giống như bạn triển khai. Ví dụ, nếu bạn đang triển khai đến heroku, bạn có thể chạy "foreman start" và máy chủ gunicorn sẽ bắt đầu ngay lập tức.

2

Tôi gặp vấn đề này trên một dòng như thế này, mất khoảng 1 giây! Đó là trong một bình bài handler:

username=request.form.get('username') 

Tôi đã thử nghiệm nó với -F curl:

curl -F username="x" http://127.0.0.1:5000/func 

Tôi chỉ thay đổi -F để -d và nó đã 0,0004 giây !!!

curl -d username="x" http://127.0.0.1:5000/func 

Tôi nghĩ rằng bình có vấn đề khi truy xuất loại nội dung "multipart/form-data".