有没有一种简单的方法来在Perl中进行异步?我有以下逻辑Apache的应用:如何在Perl中使用异步编程?
get request
process request
write to log
return
我想要做的是有“写入日志”部分是异步,让我可以尽快做“回归”的一部分。
有没有一种简单的方法来在Perl中进行异步?我有以下逻辑Apache的应用:如何在Perl中使用异步编程?
get request
process request
write to log
return
我想要做的是有“写入日志”部分是异步,让我可以尽快做“回归”的一部分。
不幸的是,这通常需要POE框架,但也有一个不断增长的替代品(我想先尝试)称为AnyEvent。
有关学习POE的更多信息,请参阅this question for learning materials。 POE是一个框架,它倾向于吃掉你的整个应用程序。它也不像看起来像Perl一样,并且坚持不懈。我相信这对你的典型应用来说是一个很大的学习曲线。
AnyEvent是基于异步任务的简单继续,你应该能够很好地解决CPAN文档问题。
为了您的具体问题,你可以使用AnyEvent's AIO或POE's Read Write wheel
你可以在Perl使用线程。 创建一个处理日志的线程。 这个线程会有一个主线程可以添加消息的缓冲区
考虑看看Coro。
从它的CPAN文档:
不同于所谓的“Perl的线程”(这不是真正的线程,但只有Windows过程仿真(详情参见同一个名字的部分移植到UNIX) ,并且像进程一样),Coro提供了完整的共享地址空间,这使得线程之间的通信变得非常简单。而且Coro的线程速度也很快:禁用perl中的Windows进程仿真代码并使用Coro可以轻松地为您的程序增加两到四倍的速度。并行矩阵乘法基准测试在单个内核上的运行速度比使用全部四个内核的四核上的perl虚拟线程快300倍以上。
这包括Coro::AIO
,一个“真正异步的文件和目录I/O”,这可能是你正在寻找的。
你真的需要在返回之前编写日志吗?
假设这是Apache mod_perl,它支持在返回响应之后触发子进程的清理处理程序。
看来你真的想要的是记录不停止返回,清理处理程序似乎这样做,而不需要异步。
你可能是对的,但现在这是一个糟糕的设计,它需要利用它现在有一些数据的事实,而不仅仅是简单的日志记录。 – Timmy 2010-02-10 03:51:15
用于Perl的许多内核引擎(MCE)附带有几个示例,演示了在许多内核中并行进行矩阵乘法。自述文件还包含基准测试结果。
https://metacpan.org/source/MARIOROY/MCE-1.514/examples/matmult/README
为什么不使用非阻塞调用来处理登录脚本的一部分写? – daotoad 2010-02-09 22:04:49
“Apache应用程序”是什么意思? mod_perl的? CGI? PSGI?以Apache作为前端的独立perl服务器? – dolmen 2012-02-11 12:06:38