Функция input
в python возвращает строку. Если вам нужны целые числа (здесь вы делаете для расчета мода), вам нужно привести приведенное значение input
к int с int(input("..."))
Принятие Ваших приложений не изменяет конфигурацию вообще, перемещает ее в начать блок:
# 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-класс, обеспечивают хеш конфигурации, но Вы не должны.
Если можно сделать классы Американского лося неизменными, который мог бы дать Вам другой удар скорости.
У меня были те же проблемы в HTML:: установка платформы Масона, и найденный этим для работы скорее хорошо: В httpd.conf:
PerlRequire handler.pl
<FilesMatch "\.mhtml$">
SetHandler perl-script
PerlHandler YourModule::Mason
</FilesMatch>
В Вашем handler.pl файле Вы определяете все свои статические объекты как Ваша конфигурация, дескрипторы базы данных, и т.д. Это определяет их в пределах YourModule:: Масон, который компилируется, когда апачский поток запускается (новые потоки будут, очевидно, иметь свойственные издержки). YourModule:: у Масона затем есть a handler
метод, который обрабатывает запрос.
Я признаю, что может быть некоторое волшебство, которое происходит в HTML:: Масон, который помогает мне с этим, но это работает на меня, возможно, на Вас?
Распространенный способ ускорить такие вещи с немногими изменениями состоит в том, чтобы просто использовать глобальные переменные и состояние кэша в них между вызовами того же процесса Apache:
use vars qw ($config);
# ...
$config = Config::General->new( ... )->getall
unless blessed($config); # add more suitable test here
Это не очень чисто и может вести для затемнения ошибок (хотя "мой $var" приводит к больше, по моему опыту), и это иногда ест большую память, но многих (повторных) дорогих операторов инициализации можно избежать этот путь. Преимущество перед использованием НАЧИНАЕТСЯ {}; код только - то, что можно повторно инициализировать на основе других событий также, не будучи должен перезапустить апача или уничтожив процесс (например, включением метки времени файла на диске в тесте выше).
Не упустите глюки хотя: простой способ ворваться
JackM имеет верное представление.
Путем загрузки всех классов и инстанцирования объектов Прикладного уровня (в случае, конфигурации) в "Родительском" процессе Apache, Вы не должны компилировать их каждый раз, когда новый рабочий мечет икру, так как они уже доступны и в памяти. Очень дотошные среди нас добавляют строку "использования" для каждого модуля, который их приложение регулярно использует. Если Вы не загружаете свои пакеты и модули в корабле-носителе, каждый рабочий получает не только удар производительности загрузки модулей, но и не получает выгоду от памяти, совместно использующей, который обеспечивают современные операционные системы.
Это - действительно другая половина различия между mod_perl и CGI. С персистентным perl-механизмом наполовину бывшего mod_perl по сравнению с перенерестящимся жемчугом CGI для каждого вызова.
Подложка импорта модуля выполняется во время компиляции, поэтому мы можно использовать это, чтобы уменьшить / исключить СУХОЙ ответ 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';