FastCgi поточно-ориентированный? - PullRequest
6 голосов
/ 21 февраля 2011

Я немного озадачен тем, как работает FastCGI. Действительно ли запущен только один экземпляр моей программы или происходит какое-то волшебное занятие? Это важно, потому что если у меня есть структуры данных, выходящие за пределы основного цикла, мне нужно знать, должны ли эти структуры данных быть поточно-ориентированными.

РЕДАКТИРОВАТЬ: Мое приложение на Perl, и вот мой конфиг apache2:

<IfModule mod_fastcgi.c>
   AddHandler fastcgi-script .fcgi .fcg
   FastCgiServer /usr/lib/app/process.fcg -idle-timeout 60 -processes 1
 </IfModule>

Просто чтобы было ясно, что я спрашиваю ... для этого кода:

use CGI::Fast qw/:standard/;

my %sharedHash;

while (new CGI::Fast) {
     # do stuff with %sharedHash
}

Безопасна ли часть "do stuff" или происходит какое-то "волшебство многопоточности", которое может означать, что несколько потоков одновременно выполняет "do stuff", что приводит к повреждению %sharedHash?

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Я считаю, что это зависит от приложения Fast-CGI.Глядя на спецификацию FastCGI раздел 4 (Типы записей управления), приложение указывает 3 значения для одновременных подключений:

  • FCGI_MAX_CONNS: максимальное количествоодновременные транспортные соединения, которые будет принимать это приложение, например, «1» или «10».

  • FCGI_MAX_REQS: максимальное количество одновременных запросов, которое будет принимать это приложение, например «1» или «50 ".

  • FCGI_MPXS_CONNS:" 0 ", если это приложение не мультиплексирует соединения (т. Е. Обрабатывает одновременные запросы по каждому соединению), в противном случае -" 1 ".

Из этого следует, что, пока ваше приложение указывает 1 для FCGI_MAX_CONNS и FCGI_MAX_REQS и 0 для FCGI_MPXS_CONNS, то любоеВеб-сервер, совместимый с FastCTI, будет рассматривать ваше приложение как полностью однопоточное, предположительно запуская новые процессы для обработки одновременных запросов к веб-серверу.

Обновление: Относительно "магической потоковой обработки" и ваших структур данных,УНЛЕсли вы разделяете свои структуры данных между несколькими запросами, я не вижу никакой причины, по которой они должны были бы быть поточно-ориентированными, - я не вижу никакой причины, по которой несколько потоков будут использоваться для обработки одного запроса, однако это зависит от вашегоБиблиотека FastCGI.

1 голос
/ 21 февраля 2011

FastCGI сам по себе является просто интерфейсом между вашим веб-сервером и вашим приложением.Ваше приложение может быть многопоточным (почти всегда в случае с Java, часто в Python) или написано в асинхронном, управляемом событиями стиле (Twisted в Python, Node.js и т. Д.).Если первое, то вам нужно убедиться, что ваш доступ к глобальным структурам состояний правильно синхронизирован потоками.

С технический документ FastCGI : Независимость от архитектуры. CGI не привязан к какой-либо конкретной серверной архитектуре (однопоточная, многопоточная и т. Д.).

...