А CGI.pm совместима с Thread?
Я сейчас пытаюсь скрипт нанисать, с тредами и FCGI и вылезло, что если запросы
идут в один и тот же тред, то у CGI.pm сносит крышу и после первого запроса
перестают менятся параметры ($q-param) ну и $q->query заодно. Если выполнить
CGI->_reset_globals (подсмотрел в CGI::Fast), то все становится хорошо, но
закрадывается подозрение, что с тредами не все хорошо будет.
Треды, если что, организуются как
for (my $t = 1; $t < THREAD_COUNT; ++$t) {
new Thread \&doit, $t;
}
doit(0);
sub doit {
my $k = shift;
my $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket,
&FCGI::FAIL_ACCEPT_ON_INTR );
while($request->Accept() >= 0 ){
process_req();
$request->Flush();
}
}
вот в process_req и делается new CGI и CGI->_reset_globals.
... Тебе пpавду сказать? Или как все было на самом деле?
Hебольшой совет: ты решы внутри себя -- у тебя CGI.pm или FCGI.
Поскольку если CGI.pm, то надо брать CGI::Fast и не выпендриваться.
> CGI->_reset_globals (подсмотрел в CGI::Fast), то все становится хорошо, но
> закрадывается подозрение, что с тредами не все хорошо будет.
>
> Треды, если что, организуются как
>
> for (my $t = 1; $t < THREAD_COUNT; ++$t) {
> new Thread \&doit, $t;
> }
> doit(0);
> sub doit {
> my $k = shift;
> my $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $socket,
> &FCGI::FAIL_ACCEPT_ON_INTR );
> while($request->Accept() >= 0 ){
> process_req();
> $request->Flush();
> }
> }
>
> вот в process_req и делается new CGI и CGI->_reset_globals.
Хотя, конечно, на худой конец можно пееписать CGI::Fast в свой код, у
нас тут OpenSource всё-таки.
Да, по сути: я конечно вообще не общался с перловым Thread,
но по идее %ENV, $socket, да вероятно и *STDIN, *STDOUT, *STDERR -- они
глобальные. Как ты собрался их в разных тредах параллельно менять?
07 Sep 10, Ilya Anfimov writes to Slawa Olhovchenkov:
>> А CGI.pm совместима с Thread?
>>
>> Я сейчас пытаюсь скрипт нанисать, с тредами и FCGI и вылезло, что если
>> запросы идут в один и тот же тред, то у CGI.pm сносит крышу и после
>> первого запроса перестают менятся параметры ($q-param) ну и $q->query
>> заодно. Если выполнить
IA> Hебольшой совет: ты решы внутри себя -- у тебя CGI.pm или FCGI.
IA> Поскольку если CGI.pm, то надо брать CGI::Fast и не выпендриваться.
CGI::Fast это две строки обертки и кривой костыль для задания сокета
>> CGI->_reset_globals (подсмотрел в CGI::Fast), то все становится хорошо,
>> но закрадывается подозрение, что с тредами не все хорошо будет.
>>
>> Треды, если что, организуются как
>>
>> for (my $t = 1; $t < THREAD_COUNT; ++$t) {
>> new Thread \&doit, $t;
>> }
>> doit(0);
>> sub doit {
>> my $k = shift;
>> my $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV,
>> $socket, &FCGI::FAIL_ACCEPT_ON_INTR );
>> while($request->Accept() >= 0 ){
>> process_req();
>> $request->Flush();
>> }
>> }
>>
>> вот в process_req и делается new CGI и CGI->_reset_globals.
IA> Хотя, конечно, на худой конец можно пееписать CGI::Fast в свой код, у
IA> нас тут OpenSource всё-таки.
IA> Да, по сути: я конечно вообще не общался с перловым Thread,
IA> но по идее %ENV, $socket, да вероятно и *STDIN, *STDOUT, *STDERR -- они
IA> глобальные. Как ты собрался их в разных тредах параллельно менять?
можно и local употребить, коль припрет.
... Вам не нpавится pезультиpующий код? Тем хуже для вас!
Считаешь, что кривой -- поправь и пришли им патч.
В любом случае, если CGI::Fast не делает за тебя CGI->_reset_globals,
то делать его придётся тебе за CGI::Fast. И Thread здесь ни при чём.
08 Sep 10, Ilya Anfimov writes to Slawa Olhovchenkov:
>> >> А CGI.pm совместима с Thread?
>> >>
>> >> Я сейчас пытаюсь скрипт нанисать, с тредами и FCGI и вылезло, что если
>> >> запросы идут в один и тот же тред, то у CGI.pm сносит крышу и после
>> >> первого запроса перестают менятся параметры ($q-param) ну и $q->query
>> >> заодно. Если выполнить
>>
>> IA> Hебольшой совет: ты решы внутри себя -- у тебя CGI.pm или FCGI.
>>
>> IA> Поскольку если CGI.pm, то надо брать CGI::Fast и не выпендриваться.
>>
>> CGI::Fast это две строки обертки и кривой костыль для задания сокета
IA> Считаешь, что кривой -- поправь и пришли им патч.
IA> В любом случае, если CGI::Fast не делает за тебя CGI->_reset_globals,
IA> то делать его придётся тебе за CGI::Fast. И Thread здесь ни при чём.
Прости, ты идиот?
Иди, перечитай письмо, авось поймешь о чем вопрос.
... КЛАВУ топтать - это вам не с ДЖОЙСТИКОМ баловаться...
Идиот в данном случае ты. CGI->_reset_globals -- это особенность
CGI для работы с несколькими запросами в одном перле. Треды тут ни при
чём.
Впрочем, с тредами в любом случае вылезут проблемы (тредов без проблем
не бывает), на одну из них я тебе ужэ указал.
08 Sep 10, Ilya Anfimov writes to Slawa Olhovchenkov:
>> >> >> А CGI.pm совместима с Thread?
>> >> >>
>> >> >> Я сейчас пытаюсь скрипт нанисать, с тредами и FCGI и вылезло, что
>> если
>> >> >> запросы идут в один и тот же тред, то у CGI.pm сносит крышу и после
>> >> >> первого запроса перестают менятся параметры ($q-param) ну и
>> $q->query
>> >> >> заодно. Если выполнить
>> >>
>> >> IA> Hебольшой совет: ты решы внутри себя -- у тебя CGI.pm или FCGI.
>> >>
>> >> IA> Поскольку если CGI.pm, то надо брать CGI::Fast и не
>> выпендриваться.
>> >>
>> >> CGI::Fast это две строки обертки и кривой костыль для задания сокета
>>
>> IA> Считаешь, что кривой -- поправь и пришли им патч.
>>
>> IA> В любом случае, если CGI::Fast не делает за тебя
>> CGI->_reset_globals,
>> IA> то делать его придётся тебе за CGI::Fast. И Thread здесь ни при чём.
>>
>> Прости, ты идиот?
>> Иди, перечитай письмо, авось поймешь о чем вопрос.
IA> Идиот в данном случае ты. CGI->_reset_globals -- это особенность
IA> CGI для работы с несколькими запросами в одном перле. Треды тут ни при
IA> чём.
очевидно же, что CGI->_reset_globals работает с данными, глобальными
относительно тредов.
это же не $q->_reset_globals.
т.е. и запросы в разных тредах друг с другом проинтерфериуют, скорее всего.
независимо от того, зову я CGI::Fast или сам ручками страдаю.
IA> Впрочем, с тредами в любом случае вылезут проблемы (тредов без проблем
IA> не бывает), на одну из них я тебе ужэ указал.
то -- не проблема ни разу.
... Утерянное всегда находишь в последнем каталоге