Я пишу скрипт CGI Perl прямо сейчас, но он становится ресурсоемкой, и он продолжает убивать мой веб-хост, потому что я продолжаю бить свой лимит памяти процесса. Мне было интересно, есть ли способ разбить скрипт, который у меня есть на несколько сценариев, а затем первым скриптом вызывать следующий скрипт, а затем выйти, чтобы весь скрипт не был в памяти сразу. Я видел, что есть модуль-экспортер, но я не знаю, как его использовать, поскольку я просто изучаю Perl, и я не думаю, что это решит проблему с моей памятью, но я могу ошибаться.Как я могу запустить длительный процесс в скрипте CGI Perl?
ответ
См. Watching long processes through CGI.
С другой стороны, простое управление памятью может также решить вашу проблему. Например, если вы сразу читаете целые файлы в памяти, попробуйте написать сценарий так, чтобы он обрабатывал данные по очереди или в фиксированных размерах. Объявите свои переменные в максимально возможной области.
Попытайтесь определить, какая часть вашего сценария создает наибольший объем памяти и опубликовать соответствующий отрывок в отдельном вопросе для получения дополнительных предложений по управлению памятью.
Да, вы можете запустить другой Perl-скрипт из Perl-скрипт, а затем выйти из сценария вызова:
http://perldoc.perl.org/functions/fork.html
Пример кода:
#!/usr/bin/perl
my $pid = fork();
if (not defined $pid) {
print "resources not avilable.\n";
} elsif ($pid == 0) {
print "IM THE CHILD\n";
sleep 5;
print "IM THE CHILD2\n";
exit(0);
} else {
print "IM THE PARENT\n";
waitpid($pid, 0);
}
print "HIYA\n";
Но это не будет работать , если вы хотите, чтобы второй скрипт мог использовать CGI для связи с вашим веб-сервером/пользователем. Если вы используете Perl-скрипт как CGI, он должен вернуть результат пользователю.
Так у вас есть два пути решения этой проблемы:
попытаться выяснить, почему вы используете так много памяти и улучшить сценарий.
Если нет способа уменьшить потребление памяти, вы можете использовать демонизированный perl-скрипт как рабочий процесс, который выполняет вычисления и возвращает результаты в ваш CGI-perl-скрипт, который должен ждать для результата до прекращения.
С 'fork()' вы теперь загрузили две копии программы (включая все данные, загруженные программой перед вилкой).Как это уменьшит объем памяти в сценарии? – mob
на самом деле это работает, потому что ребенок наследует открытые дескрипторы файла от родителя, поэтому, когда ребенок записывает в stdout, он перейдет к тому же stdout, что и родительский, то есть к каналу, который веб-сервер открыл с помощью скрипта cgi. – miedwar
fork() генерирует самостоятельный, независимый процесс (http://en.wikipedia.org/wiki/Fork_%28operating_system%29). Вы можете запускать разные скрипты с помощью fork, и поэтому каждая часть меньше как полная часть. Затем вам нужно управлять изменением данных между всеми процессами - никто не сказал, что это просто :) – Erik
Если применимо, сделайте вычисление/поколение выключенным.
создать демон или запланированное задание, которое создает статическую версию результатов, демон может создавать новую версию результатов событий (например, файлов, измененных) или в заданные интервалы.
Если вы создаете страницу в зависимости от ввода клиента, изучите разделение логики, чтобы можно было кэшировать, по крайней мере, часть приложения.
Примечание стороны, если это не костюмы ваших потребностей, я бы отойти от CGI вообще и смотреть в mod_perl или fastcgi, где у вас есть постоянные процессы перл для обработки запросов, что экономит накладные расходы на разветвление нового Perl переводчицы, загрузочные модули и т. д.
- 1. Процесс URL в CGI скрипте
- 2. Как запустить длительный процесс php
- 3. Как запустить длительный процесс в службе windows?
- 4. В Perl CGI, как я могу использовать команды UNIX?
- 5. Как я могу отладить скрипт CGI Perl?
- 6. Как проверить даты в Perl CGI-скрипте?
- 7. Как запустить cover.py на длительный процесс?
- 8. Как я могу вызвать еще один скрипт CGI Perl в CGI-скрипте?
- 9. Как запустить длительный процесс с использованием сервлета
- 10. Как запустить длинный фоновый процесс из программы Perl CGI?
- 11. Как я могу запустить и забыть процесс в Perl?
- 12. Как я могу запустить внешний процесс в Perl?
- 13. Как запустить скрипт CGI perl без apache?
- 14. PHP длительный процесс в браузере
- 15. Как запустить несколько Perl-CGI на IIS
- 16. Как я могу надежно определить имя загруженного файла в скрипте CGI Perl?
- 17. Как я могу отладить возможную утечку памяти в скрипте Perl CGI?
- 18. Как я могу получить и использовать настройки TZ пользователя из их .bashrc в Perl CGI-скрипте?
- 19. Как я могу сделать разбиение на страницы в моем скрипте CGI на Perl?
- 20. Как я могу вызвать curl из скрипта CGI Perl?
- 21. Как запустить фоновый процесс с mod perl
- 22. Как использовать API Google в perl CGI-скрипте?
- 23. Как использовать utf-8 в perl cgi-bin скрипте?
- 24. показать изображение в скрипте Perl
- 25. Длительный процесс в ASP.Net MVC
- 26. Могу ли я распространять длительный хранимый процесс через несколько процессоров?
- 27. Как я могу прочитать параметр URL в программе Perl CGI?
- 28. RnR: Длительный процесс
- 29. Длительный процесс java
- 30. Показывает длительный процесс оболочки с Apache
Вам нужна дополнительная информация о том, что делает ваш сценарий, или, что более важно, пример кода. Если вы можете запустить/создать новый процесс, который будет менее интенсивным, вы можете освободить память в текущем процессе. – vol7ron