Как использовать асинхронное программирование в Perl? - PullRequest
5 голосов
/ 09 февраля 2010

Есть ли простой способ сделать асинхронный в Perl? У меня есть следующая логика для приложения Apache:

get request
process request
write to log
return

я хочу, чтобы часть «write to log» была асинхронной, чтобы я мог выполнить часть «return» как можно скорее.

Ответы [ 5 ]

7 голосов
/ 10 февраля 2010

Посмотрите на Коро .

Из документации CPAN:

В отличие от так называемых «потоков Perl» (которые на самом деле не являются реальными потоками, а являются только эмуляцией процессов Windows (см. Раздел с тем же именем), портированной на unix, и, таким образом, действуют как процессы), Coro предоставляет полное общее адресное пространство, что делает общение между потоками очень простым. И потоки Coro также быстрые: отключение кода эмуляции процесса Windows в вашем perl и использование Coro могут легко привести к увеличению скорости ваших программ в два-четыре раза. Тест параллельного умножения матриц выполняется в 300 раз быстрее на одном ядре, чем псевдопотоки perl на четырехъядерном процессоре с использованием всех четырех ядер.

Это включает в себя Coro::AIO, «действительно асинхронный ввод-вывод файлов и каталогов», который может быть тем, что вы ищете.

7 голосов
/ 10 февраля 2010

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

См. этот вопрос для учебных материалов для получения дополнительной информации об обучении POE. POE - это фреймворк, и он имеет тенденцию поглощать все ваше приложение. Это также не выглядит как Perl, и торчит. Я считаю, что это большая кривая обучения для вашего типичного приложения.

AnyEvent - это простое асинхронное задание, основанное на продолжении, вы должны быть в состоянии понять это довольно просто с помощью документов CPAN.

Для вашего конкретного вопроса вы должны использовать AIO AnyEvent или Колесо чтения / записи POE

6 голосов
/ 10 февраля 2010

Вам действительно нужно писать логи перед возвращением?

Предполагая, что это Apache mod_perl, он поддерживает обработчики очистки, которые запускаются для дочернего процесса после возврата ответа.

Похоже, что вы ДЕЙСТВИТЕЛЬНО хотите, чтобы протоколирование не останавливало возврат, похоже, что обработчики очистки делают это без необходимости асинхронизации.

3 голосов
/ 10 февраля 2010

вы можете использовать темы в Perl. создать поток, который обрабатывает журналы. у этого потока будет буфер, в который основной поток может добавлять сообщения

0 голосов
/ 19 февраля 2013

Многоядерный движок для Perl (MCE) поставляется с несколькими примерами, демонстрирующими умножение матриц параллельно на многие ядра. В файле readme также содержатся результаты тестов.

https://metacpan.org/source/MARIOROY/MCE-1.514/examples/matmult/README

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...