Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

CGI & thread

4 views
Skip to first unread message

Slawa Olhovchenkov

unread,
Sep 6, 2010, 9:19:34 AM9/6/10
to
Hello All!

А 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авду сказать? Или как все было на самом деле?

Ilya Anfimov

unread,
Sep 7, 2010, 10:46:44 AM9/7/10
to
2010-09-06, Slawa Olhovchenkov <Slawa.Olh...@f500.n5030.z2.fidonet.org> пишет:

> Hello All!
>
> А CGI.pm совместима с Thread?
>
> Я сейчас пытаюсь скрипт нанисать, с тредами и FCGI и вылезло, что если запросы
> идут в один и тот же тред, то у CGI.pm сносит крышу и после первого запроса
> перестают менятся параметры ($q-param) ну и $q->query заодно. Если выполнить

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 -- они
глобальные. Как ты собрался их в разных тредах параллельно менять?

Slawa Olhovchenkov

unread,
Sep 7, 2010, 11:37:44 AM9/7/10
to
Hello Ilya!

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ующий код? Тем хуже для вас!

Ilya Anfimov

unread,
Sep 8, 2010, 4:39:25 AM9/8/10
to
2010-09-07, Slawa Olhovchenkov <Slawa.Olh...@f500.n5030.z2.fidonet.org> пишет:

> Hello Ilya!
>
> 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::Fast не делает за тебя CGI->_reset_globals,
то делать его придётся тебе за CGI::Fast. И Thread здесь ни при чём.

Slawa Olhovchenkov

unread,
Sep 8, 2010, 3:48:08 AM9/8/10
to
Hello Ilya!

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 здесь ни при чём.

Прости, ты идиот?
Иди, перечитай письмо, авось поймешь о чем вопрос.

... КЛАВУ топтать - это вам не с ДЖОЙСТИКОМ баловаться...

Ilya Anfimov

unread,
Sep 8, 2010, 5:04:58 AM9/8/10
to
2010-09-08, Slawa Olhovchenkov <Slawa.Olh...@f500.n5030.z2.fidonet.org> пишет:

Идиот в данном случае ты. CGI->_reset_globals -- это особенность
CGI для работы с несколькими запросами в одном перле. Треды тут ни при
чём.

Впрочем, с тредами в любом случае вылезут проблемы (тредов без проблем
не бывает), на одну из них я тебе ужэ указал.

Slawa Olhovchenkov

unread,
Sep 8, 2010, 4:45:50 AM9/8/10
to
Hello Ilya!

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> не бывает), на одну из них я тебе ужэ указал.

то -- не проблема ни разу.

... Утерянное всегда находишь в последнем каталоге

0 new messages