2014-02-13 4 views
5

요청을 처리하는 동안 상당히 긴 IO 호출이 포함되는 반면 들어오는 웹 요청을 동시에 응답 할 수 있도록 노력하고 있습니다. 나는 "non-blocking"이되어야하기 때문에 gevent를 사용할 것입니다.논 블로킹 동시 wsgi 서버

내가 발견 한 문제는 gevent 스레드가 많더라도 요청이 순차적으로 처리된다는 것입니다. 어떤 이유로 인해 단일 녹색 스레드가 요청을 처리합니다.

나는 (여기에 내가 생각하는 것과 관련없는 기본 설정으로) nginx를 가지고 있고, 또한 나는 uvent와 gevent.sleep()으로 IO 차단 호출을 에뮬레이트하는 간단한 wsgi 응용 프로그램을 갖고있다. 여기에 그들이있다 :

uwsgi.ini

[uwsgi] 
chdir = /srv/website 
home = /srv/website/env 
module = wsgi:app 
socket = /tmp/uwsgi_mead.sock 
#daemonize = /data/work/zx900/mob-effect.mead/logs/uwsgi.log 
processes = 1 
gevent = 100 
gevent-monkey-patch 

wsgi.py

import gevent 
import time 
from flask import Flask 

app = Flask(__name__) 

@app.route("/") 
def hello(): 
    t0 = time.time() 
    gevent.sleep(10.0) 
    t1 = time.time() 
    return "{1} - {0} = {2}".format(t0, t1, t1 - t0) 

나는 동시에 (거의) 여기에 열린 두 브라우저에서 탭, 무엇을 것입니다 I 결과로 받으세요 :

1392297388.98 - 1392297378.98 = 10.0021491051 
# first tab, processing finished at 1392297378.98 

1392297398.99 - 1392297388.99 = 10.0081849098 
# second tab, processing started at 1392297398.99 

보시다시피 먼저보기의 실행을 차단하십시오. 내가 뭘 잘못 했니?

+0

'processes = 1'을 증가시킬 수 있습니까? –

+1

2 ~ 10 개의 요청을 처리하고 싶다면 여러 프로세스 나 스레드를 실행하고 하루 만 호출하면됩니다. 나는 심지어 그럴 필요가 없다. 하지만 수천 개의 동시 요청이 천천히 처리 될 것입니다. 이벤트 루프가 필요하고 분명히 뭔가 잘못되었습니다. – Arseniy

+0

나는 gunicorn의 gevent (또는 eventlet) 작업자가 내가 원하는대로 할 것이라고 생각합니다. 이런 식으로 나 자신을 사용하지 않았다. – dcrosta

답변

3

브라우저 또는 브라우저 이외의 브라우저로 요청을 보내려면 사이트 당 또는 주소 당 동시 연결 수에 제한이 있습니다. 또는 두 개의 서로 다른 브라우저를 사용하십시오.