Как я могу выполнить неэффективный код только во время компиляции при использовании mod_perl?

Функция input в python возвращает строку. Если вам нужны целые числа (здесь вы делаете для расчета мода), вам нужно привести приведенное значение input к int с int(input("..."))

9
задан David McLaughlin 5 December 2008 в 13:58
поделиться

6 ответов

Принятие Ваших приложений не изменяет конфигурацию вообще, перемещает ее в начать блок:

# this code goes at file scope
my $config;
BEGIN {
    $config = { Config::General->new( ... )->getall }
}

# when creating a new instance
$self->config( $config );

И удостоверьтесь, что все Ваши модули компилируются в startup.pl.

Вы могли стать более необычными, и иметь singleton-класс, обеспечивают хеш конфигурации, но Вы не должны.

10
ответ дан 4 December 2019 в 13:05
поделиться

Если можно сделать классы Американского лося неизменными, который мог бы дать Вам другой удар скорости.

4
ответ дан 4 December 2019 в 13:05
поделиться

У меня были те же проблемы в HTML:: установка платформы Масона, и найденный этим для работы скорее хорошо: В httpd.conf:

PerlRequire handler.pl
<FilesMatch "\.mhtml$">
  SetHandler perl-script
  PerlHandler YourModule::Mason
</FilesMatch>

В Вашем handler.pl файле Вы определяете все свои статические объекты как Ваша конфигурация, дескрипторы базы данных, и т.д. Это определяет их в пределах YourModule:: Масон, который компилируется, когда апачский поток запускается (новые потоки будут, очевидно, иметь свойственные издержки). YourModule:: у Масона затем есть a handler метод, который обрабатывает запрос.

Я признаю, что может быть некоторое волшебство, которое происходит в HTML:: Масон, который помогает мне с этим, но это работает на меня, возможно, на Вас?

1
ответ дан 4 December 2019 в 13:05
поделиться

Распространенный способ ускорить такие вещи с немногими изменениями состоит в том, чтобы просто использовать глобальные переменные и состояние кэша в них между вызовами того же процесса Apache:

use vars qw ($config);
# ...
$config = Config::General->new( ... )->getall
    unless blessed($config); # add more suitable test here

Это не очень чисто и может вести для затемнения ошибок (хотя "мой $var" приводит к больше, по моему опыту), и это иногда ест большую память, но многих (повторных) дорогих операторов инициализации можно избежать этот путь. Преимущество перед использованием НАЧИНАЕТСЯ {}; код только - то, что можно повторно инициализировать на основе других событий также, не будучи должен перезапустить апача или уничтожив процесс (например, включением метки времени файла на диске в тесте выше).

Не упустите глюки хотя: простой способ ворваться

0
ответ дан 4 December 2019 в 13:05
поделиться

JackM имеет верное представление.

Путем загрузки всех классов и инстанцирования объектов Прикладного уровня (в случае, конфигурации) в "Родительском" процессе Apache, Вы не должны компилировать их каждый раз, когда новый рабочий мечет икру, так как они уже доступны и в памяти. Очень дотошные среди нас добавляют строку "использования" для каждого модуля, который их приложение регулярно использует. Если Вы не загружаете свои пакеты и модули в корабле-носителе, каждый рабочий получает не только удар производительности загрузки модулей, но и не получает выгоду от памяти, совместно использующей, который обеспечивают современные операционные системы.

Это - действительно другая половина различия между mod_perl и CGI. С персистентным perl-механизмом наполовину бывшего mod_perl по сравнению с перенерестящимся жемчугом CGI для каждого вызова.

-2
ответ дан 4 December 2019 в 13:05
поделиться

Подложка импорта модуля выполняется во время компиляции, поэтому мы можно использовать это, чтобы уменьшить / исключить СУХОЙ ответ ysth .

В следующем примере мы используем метод импорта для чтения файла конфигурации с переданными нам аргументами, а затем отправляем эту конфигурацию в вызывающий пакет.

Предостережение: любая переменная $ config в вызывающем пакете будет уничтожена этим.

package Foo_Config;
use English qw(-no_match_vars);
sub import {
   my ($self, @cfg) = @ARG;
   my $call_pkg     = caller;
   my $config       = {Config::General->new(@cfg)->getall};
   do{ # this will create the $config variable in the calling package.
       no strict 'refs';
       ${$call_pkg . '::config'} = $config;
   };
   return;
}

package MyApp;
# will execute Foo_Config->import('/path/to/site.config') at compile time.
use Foo_Config '/path/to/site.config'; 
3
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: