요청을 처리하는 동안 상당히 긴 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
보시다시피 먼저보기의 실행을 차단하십시오. 내가 뭘 잘못 했니?
'processes = 1'을 증가시킬 수 있습니까? –
2 ~ 10 개의 요청을 처리하고 싶다면 여러 프로세스 나 스레드를 실행하고 하루 만 호출하면됩니다. 나는 심지어 그럴 필요가 없다. 하지만 수천 개의 동시 요청이 천천히 처리 될 것입니다. 이벤트 루프가 필요하고 분명히 뭔가 잘못되었습니다. – Arseniy
나는 gunicorn의 gevent (또는 eventlet) 작업자가 내가 원하는대로 할 것이라고 생각합니다. 이런 식으로 나 자신을 사용하지 않았다. – dcrosta