2015-04-08 17 views
6

Tôi đang cố gắng thực hiện việc bỏ phiếu dài với JQuery và Python trong Khuôn khổ Flask.Thăm dò dài trong Python với Flask

Sau khi thực hiện bỏ phiếu dài trước đây trong PHP, tôi đã cố gắng để đi về nó theo cách giống nhau:

Một kịch bản/chức năng mà có một while (true) vòng lặp, kiểm tra các thay đổi theo định kỳ eg.every 0 , 5 giây trong cơ sở dữ liệu và trả về một số dữ liệu khi có thay đổi.

Vì vậy, trong số ini .py Tôi đã tạo một ứng dụng.đi tới/cuộc thăm dò để JQuery gọi. JQuery cung cấp cho nó một số thông tin về trạng thái hiện tại của máy khách và hàm poll() so sánh nó với những gì hiện có trong cơ sở dữ liệu. Vòng lặp kết thúc và trả về thông tin khi có thay đổi.

Dưới đây là đoạn code python:

@app.route('/poll') 
def poll(): 
client_state = request.args.get("state") 

    #remove html encoding + whitesapce from client state 
    html_parser = HTMLParser.HTMLParser() 
    client_state = html_parser.unescape(client_state) 
    client_state = "".join(client_state.split()) 

    #poll the database 
    while True: 
     time.sleep(0.5) 
     data = get_data() 
     json_state = to_json(data) 
     json_state = "".join(data) #remove whitespace 

     if json_state != client_state: 
      return "CHANGE" 

Vấn đề là, khi mã ở trên bắt đầu bỏ phiếu, các máy chủ dường như bị quá tải và Ajax khác gọi, và các yêu cầu khác như tải một "tải" ảnh để html bằng cách sử dụng JQuery không phản hồi và hết thời gian chờ.

Vì hoàn của tôi đã bao gồm các JQuery đây:

function poll() { 

queryString = "state="+JSON.stringify(currentState); 

$.ajax({ 
    url:"/poll", 
    data: queryString, 
    timeout: 60000, 
    success: function(data) { 
     console.log(data); 
     if(currentState == null) { 
      currentState = JSON.parse(data); 
     } 
     else { 
      console.log("A change has occurred"); 
     } 

     poll(); 

    }, 
    error: function(jqXHR, textStatus, errorThrown) { 

     console.log(jqXHR.status + "," + textStatus + ", " + errorThrown); 

     poll(); 

    } 
}); 

} 

Liệu điều này cần phải đa luồng hay cái gì? Hay bất cứ ai có bất kỳ ý tưởng tại sao tôi gặp phải hành vi này?

Cảm ơn trước !! :)

+5

Xem http://stackoverflow.com/questions/14814201/can-i-serve-multiple-clients-using-just-flask-app-run-as-standalone –

Trả lời

3

Giống như link @ Robᵩ đã đề cập, ứng dụng bình của bạn chỉ là quá tải. Đó là bởi vì một ứng dụng bình là trong chế độ luồng đơn theo mặc định khi chạy với app.run(), do đó, nó chỉ có thể phục vụ một yêu cầu mỗi lần.

Bạn có thể bắt đầu đa luồng với:

if __name__ == '__main__': 
    app.run(threaded=True) 

Hoặc sử dụng một máy chủ WSGI như gunicorn hoặc uwsgi để phục vụ bình với đa chế biến:

gunicorn -w 4 myapp:app 

Hy vọng bạn đang thưởng thức với Python và Flask !

+1

Nói chung, mặc dù các ứng dụng WSGI không phù hợp cho lâu dài bỏ phiếu ở bất kỳ loại quy mô nào, mặc dù cũng áp dụng cho PHP. Điều này là do cả hai Python khi sử dụng WSGI và PHP là các hệ thống đồng bộ và cần một quy trình hoặc luồng để xử lý mọi yêu cầu. Vì vậy, để xử lý một số lượng lớn các yêu cầu thăm dò ý kiến ​​đồng thời lâu dài, bạn cần rất nhiều dung lượng (các tiến trình hoặc luồng). Việc bỏ phiếu dài được thực hiện tốt hơn bằng cách sử dụng một máy chủ web và khung công tác không đồng bộ. –

+0

Việc thay thế nếu sử dụng gunicorn là sử dụng coroutines thông qua các sự kiện hoặc công nhân gevent. Làm điều đó mặc dù không đặt nhiều hạn chế về ứng dụng của bạn vì bạn chỉ có thể sử dụng các máy khách cho các dịch vụ phụ trợ và các cơ sở dữ liệu mà coroutine biết để tránh chúng chặn toàn bộ quá trình. Vì vậy, coroutines không chỉ đơn giản là ma thuật mà làm cho mọi thứ tốt đẹp. –

+0

@GrahamDumpleton Có, một máy chủ không đồng bộ muốn Tornado trở nên tốt hơn, và thường đó là lựa chọn đầu tiên của tôi cho việc xây dựng API hoặc máy chủ WebSocket. – kxxoling

Các vấn đề liên quan