Блокировка звонков с помощью Gevent и WSGI - PullRequest
3 голосов
/ 17 августа 2011

Я только начал работать с сопрограммами и прочитал о gevent и greenlets. Для теста я подал этот код через модуль gevents pywsgi:

from gevent.pywsgi import WSGIServer
import gevent

def hello_world(env, start_response):
    gevent.sleep(5)
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<b>hello world</b>"]

print 'Serving on 8088...'
WSGIServer(('127.0.0.1', 8888), hello_world).serve_forever()

Я ожидал результата, при котором каждый запрос получал бы 5-секундную задержку перед отображением текста. Однако происходит то, что каждый запрос ставится в очередь с вызовом gevent.sleep (), который заставляет второй запрос занимать почти 10 секунд, если он был инициирован сразу после первого.

Разве функция serve_forever не порождает новые гринлеты для каждого запроса?

Ответы [ 2 ]

6 голосов
/ 18 августа 2011

Что вы используете для отправки запросов? Я подозреваю, что проблема лежит там.

Я протестировал ваш код с помощью ab (Apache Benchmark) и получил это (отредактированный вывод):

$ ab -c 200 -n 200 http://localhost:8888/

Completed 100 requests
Completed 200 requests
Finished 200 requests

Concurrency Level:      200
Time taken for tests:   5.048 seconds
Requests per second:    39.62 [#/sec] (mean)
Time per request:       5048.386 [ms] (mean)

Команда ab делает 200 одновременных запросов к серверу gevent. Через пять секунд все запросы были выполнены. Если запросы были поставлены в очередь, как вы предлагаете, этот тест занял бы 1000 секунд.

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

0 голосов
/ 18 августа 2011

Известно, что браузеры ставят запросы в очередь к одному и тому же домену.

Попробуйте открыть разные браузеры (не разные окна браузера, фактически разные приложения, например FF и Chrome) для разных соединений.

...