2014-11-14 3 views
6

, 나는 병이 요청을 동시에 처리 할 생각, 그래서 내가 우는 소리 테스트 코드를 작성 : 병은 병행 성이없는 요청을 처리합니까? 처음에는

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) 

가 그럼 난 10 개 스레드 /test URL을 요청하여 JMeter를 사용하여 20 회 반복합니다.

그 후 /status은 병이 요청을 동시에 처리하지 않는 것 같아 {"numbers": 200}을 제공합니다.

나는 오해 했습니까?

UPDATE 내가 다른 테스트를했다

, 나는 그것이 하나 (동시성에) 하나의 요청으로 그 병의 거래를 증명할 수 있다고 생각합니다. 나는 test 기능에 거의 변화했다 :

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

을 그리고 브라우저에서 두 번 /test에 액세스 할 때 내가 얻을 :

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

'200'은 OK 신호에 대한 HTTP 코드입니다. http : //www.w3.org/Protocols/rfc2616/rfc2616-sec10.html – Nilesh

+0

@Lafada 오, 더 명확하게 말하면,/상태는 나에게' { "numbers": 200}' – WKPlus

+0

이제 적절한 답을 줄 수 있습니다. – Nilesh

답변

12

동시성이 당신의 웹 프레임 워크의 기능이 아니다 - 그것은이다 기능을 제공하는 데 사용하는 웹 서버의 기능입니다. 병이 WSGI 호환이기 때문에, 당신이 어떤 WSGI 서버를 통해 병의 응용 서비스를 제공 할 수 의미

  • wsgiref (파이썬 다음 stdlib 참조 서버) 당신에게 동시성을 제공하지 않습니다.
  • CherryPy는 스레드 풀 (동시 요청 수 = 사용중인 스레드 수)을 통해 전달됩니다.
  • nginx + uwsgi는 다중 프로세스 디스패치 개의 프로세스 당 여러 스레드를 제공합니다.
  • Gevent는 응용 프로그램이 IO 또는 데이터베이스 기반 응용 프로그램 인 경우 CPU 사용량이 거의없는 C10K +를 Linux에서 쉽게 사용할 수있는 가벼운 동시 루틴을 제공합니다 (Windows에서는 1024 개의 동시 열린 소켓 만 처리 할 수 ​​있습니다) 경계.

후자의 두 개는 동시에 많은 수의 동시 연결을 제공 할 수 있습니다.

http://bottlepy.org/docs/dev/api.html에 따르면 특정 지침이없는 경우 bottle.run은 wsgiref를 사용하여 응용 프로그램을 제공하므로 한 번에 하나의 요청 만 처리하는 이유가 설명됩니다.

+0

답해 주셔서 감사합니다. 전에 인터뷰에서 병 동시성 문제에 대해 질문을 받았는데, 전에 이것을 읽었 으면 좋았을 것입니다. – cizixs