如何在Perl中使用异步编程?

时间:2010-02-09 20:59:09

标签: performance perl

在Perl中有一种简单的异步方式吗?我对Apache应用程序有以下逻辑:

get request
process request
write to log
return

我想要做的是将“写入日志”部分设置为异步,以便我可以尽快完成“返回”部分。

5 个答案:

答案 0 :(得分:7)

不幸的是,这通常需要POE框架,但是还有一个不断增长的替代方案(我想首先尝试)AnyEvent

有关学习POE的更多信息,请参阅this question for learning materials。 POE是一个框架,它往往会吃掉你的整个应用程序。它也不像Perl一样看起来像,并且坚持下去。我相信这对于您的典型应用来说是一个很大的学习曲线。

AnyEvent是基于异步任务的简单延续,你应该只用CPAN文档很好地解决它。

对于您的具体问题,您可以使用AnyEvent's AIOPOE's Read Write wheel

答案 1 :(得分:7)

考虑查看Coro

从其CPAN文档:

  

与所谓的“Perl线程”(实际上并不是真正的线程,但只有windows进程仿真(请参阅同名部分以获取更多详细信息)移植到unix,并因此充当进程),Coro提供了完整的共享地址空间,这使得线程之间的通信非常容易。 Coro的线程也很快:在你的perl中禁用Windows进程仿真代码并使用Coro可以轻松地为你的程序提高2到4倍的速度。并行矩阵乘法基准测试在单个内核上的运行速度比使用所有四个内核的四核上的perl伪线程快300多倍。

这包括Coro::AIO,一个“真正异步的文件和目录I / O”,这可能就是你要找的东西。

答案 2 :(得分:6)

你真的需要在返回之前写日志吗?

假设这是Apache mod_perl,它支持在返回响应后为子进程触发的清理处理程序。

看起来你真正想要的是日志记录不要停止返回,清理处理程序似乎会在不需要异步的情况下这样做。

答案 3 :(得分:3)

你可以在perl中使用线程。 创建一个处理日志的线程。 这个线程有一个缓冲区,主线程可以向它添加消息

答案 4 :(得分:0)

用于Perl的多核引擎(MCE)附带了几个示例,演示了跨多个内核并行的矩阵乘法。自述文件也包含基准测试结果。

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