Однопоточная конфигурация Wsgi на многопоточном сервере Apache

WSGIDaemonProcess <user> processes=5 threads=1 python-home=/path/to

WSGIProcessGroup <user>
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIApplicationGroup %{GLOBAL}

В моем приложении используется Gdal, который не является потокобезопасным. В документации предлагается использовать wsgi с threads=1. Если в конфигурации apache используется mpm-worker с многопотоковым соединением, будет ли threads=1 гарантировать безопасность потоков?

Настройки апача:

KeepAlive Off
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 5
MinSpareThreads 1
MaxSpareThreads 3
ThreadsPerChild 5

дополнительная цитата к принятому ответу выглядит следующим образом:

StartServers          2
ThreadsPerChild      25
WSGIDaemonProcess processes=1 threads=15

В случае приложения WSGI дочерние рабочие процессы Apache действуют только как прокси, перенаправляя запросы в процесс(ы) режима демона mod_wsgi для обработки.

Таким образом, с двумя дочерними рабочими процессами Apache максимальное количество соединений равно 50 (каждый из которых имеет 25 потоков). Эти дочерние рабочие процессы Apache принимают соединения как для запросов статических файлов, так и для динамических запросов, которые затем передаются через прокси в процесс режима демона mod_wsgi. Только с одним процессом режима демона mod_wsgi само приложение WSGI сможет обрабатывать 15 одновременных запросов.

Если есть запросы, обрабатываемые процессом режима демона mod_wsgi, поскольку дочерние рабочие процессы Apache передают запросы и ответы, поток по-прежнему используется для жизни запроса в дочерних рабочих процессах Apache. 35 (50-15) дополнительных потоков в дочерних рабочих процессах Apache по-прежнему будут доступны для обработки статических запросов, поддержки соединений и действия в качестве механизма буферизации для ожидающих динамических запросов к приложению WSGI. Последнее особенно полезно для медленных клиентов, поскольку дочерние рабочие процессы apache не будут пересылать запрос процессу демона mod_wsgi до тех пор, пока не будет доступна полная информация о запросе.

Обратите внимание: только потому, что процесс режима демона mod_wsgi может обрабатывать только 15 одновременных запросов, не означает, что он может обрабатывать только такое количество запросов в секунду. Сколько запросов в секунду будет зависеть от того, насколько медленным является ваше приложение и какая конкуренция существует на общих ресурсах. Последние влияют на необходимость сериализации операций.

В целом, режим демона mod_wsgi можно сравнить с использованием mod_proxy перед отдельным внутренним веб-сервером. В этом случае mod_wsgi создал процессы демона и управляет ими от вашего имени.

Грэм Дамплтон


person raratiru    schedule 16.03.2018    source источник
comment
Спасибо за включение цитаты, чрезвычайно ценная информация, которая должна была быть более четко задокументирована на странице mod_wsgi.   -  person Dennis Lau    schedule 24.09.2019


Ответы (1)


При использовании режима демона mod_wsgi запросы Python обрабатываются в процессах, отдельных от дочерних рабочих процессов Apache, поэтому да, использование threads=1 в этом случае гарантирует безопасность потоков.

Для получения дополнительной информации о том, как работают процессы и потоки в mod_wsgi, прочитайте документацию об этом:

Вы также можете посмотреть:

person Graham Dumpleton    schedule 16.03.2018