2014-11-14 18 views
6

Lúc đầu, tôi nghĩ rằng Chai sẽ xử lý yêu cầu đồng thời, vì vậy tôi đã viết mã kiểm tra dưới đây:Có yêu cầu xử lý chai không có đồng thời không?

import json 
from bottle import Bottle, run, request, response, get, post 
import time 

app = Bottle() 
NUMBERS = 0 


@app.get("/test") 
def test(): 
    id = request.query.get('id', 0) 
    global NUMBERS 
    n = NUMBERS 
    time.sleep(0.2) 
    n += 1 
    NUMBERS = n 
    return id 


@app.get("/status") 
def status(): 
    return json.dumps({"numbers": NUMBERS}) 


run(app, host='0.0.0.0', port=8000) 

Sau đó, tôi sử dụng JMeter để yêu cầu /test url với 10 chủ đề vòng 20 lần.

Sau đó, /status cho tôi {"numbers": 200}, có vẻ như chai đó không xử lý yêu cầu đồng thời.

Tôi có hiểu lầm gì không?

CẬP NHẬT

tôi đã làm thử nghiệm khác, tôi nghĩ rằng nó có thể chứng minh rằng thỏa thuận chai với yêu cầu từng người một (không đồng thời). Tôi đã làm một sự thay đổi nhỏ đến test chức năng:

@app.get("/test") 
def test(): 
    t1 = time.time() 
    time.sleep(5) 
    t2 = time.time() 
    return {"t1": t1, "t2": t2} 

Và khi tôi truy cập /test hai lần trong một trình duyệt tôi nhận được:

{ 
    "t2": 1415941221.631711, 
    "t1": 1415941216.631761 
} 
{ 
    "t2": 1415941226.643427, 
    "t1": 1415941221.643508 
} 
+0

'200' là Mã HTTP cho tín hiệu OK http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – Nilesh

+0

@Lafada Ồ, hãy để tôi làm rõ hơn,'/status' cho tôi ' {"numbers": 200} ' – WKPlus

+0

bây giờ chúng ta có thể trả lời đúng :) – Nilesh

Trả lời

12

Concurrency không phải là một chức năng của khuôn khổ web của bạn - đó là một chức năng của máy chủ web mà bạn sử dụng để phục vụ. Vì Chai là tuân thủ WSGI, điều đó có nghĩa là bạn có thể phục vụ các ứng dụng Chai thông qua bất kỳ máy chủ WSGI nào:

  • wsgiref (máy chủ tham chiếu trong Python stdlib) sẽ không đồng thời.
  • CherryPy gửi qua một nhóm luồng (số lượng yêu cầu đồng thời = số lượng chủ đề mà nó đang sử dụng).
  • nginx + uwsgi cung cấp cho bạn công văn đa xử lý nhiều chủ đề cho mỗi quá trình.
  • Gevent cung cấp cho bạn coroutines trọng lượng nhẹ, trong trường hợp sử dụng của bạn, có thể dễ dàng đạt được C10K + với rất ít tải CPU (trên Linux - trên Windows nó chỉ có thể xử lý 1024 socket mở đồng thời) nếu ứng dụng của bạn chủ yếu là IO- hoặc cơ sở dữ liệu- bị ràng buộc.

Hai sau có thể phục vụ số lượng lớn các kết nối đồng thời.

Theo http://bottlepy.org/docs/dev/api.html, khi đưa ra không có hướng dẫn cụ thể, sử dụng bottle.run wsgiref để phục vụ ứng dụng của bạn, điều này giải thích lý do tại sao nó chỉ xử lý một yêu cầu cùng một lúc.

+0

Cảm ơn câu trả lời của bạn. Ngày hôm kia tôi được hỏi về vấn đề đồng thời với chai tại một cuộc phỏng vấn, ước gì tôi đã đọc điều này trước đây. – cizixs

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