Без блокировки параллельного сервера тут WSGI


Я пытаюсь быть в состоянии отвечать на входящие веб-запросы одновременно, в то время как обработка запроса включает довольно длительный вызов IO. Я собираюсь использовать gevent, поскольку он должен быть "неблокирующим"

Проблема, которую я обнаружил, заключается в том, что запросы обрабатываются последовательно, хотя у меня есть много потоков gevent. По какой-то причине запросы обслуживаются одной зеленой нитью.

У меня есть nginx (с конфигурацией по умолчанию, которая здесь не уместна, я думаю), также у меня есть uwsgi и простой wsgi приложение, которое эмулирует вызов блокировки ввода-вывода Как gevent.сон(). Вот они:

Увсги.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)

Затем я одновременно (почти) открываю две вкладки в моем браузере, и вот что я получаю в результате:

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

Как видите, первый вызов заблокировал выполнение представления. Что я сделал не так?

1 5

1 ответ:

Отправляйте запросы с помощью curl или чего-либо еще, кроме браузера, поскольку браузер имеет ограничение на количество одновременных подключений на сайт или на адрес. Или используйте два разных браузера.