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

Tim*_*mmy 5 perl performance

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

get request
process request
write to log
return
Run Code Online (Sandbox Code Playgroud)

我想要做的是让"写入日志"部分是异步的,这样我就可以尽快做"返回"部分.

Eva*_*oll 7

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

有关学习POE的更多信息,请参阅此问题以获取学习资料.POE是一个框架,它往往会吃掉你的整个应用程序.它也看起来不像Perl,并且坚持下去.我相信这对于您的典型应用来说是一个很大的学习曲线.

AnyEvent是基于异步任务的简单延续,你应该能够用CPAN文档很好地理解它.

对于您的具体问题,您将使用AnyEvent的AIOPOE的读写轮

  • 您可以使用简单的非阻塞套接字将数据发送到POE日志写入守护程序.并且,正如daotoad所说,只要你限制每个文件的一个写入过程,那么你可以只使用一个非阻塞句柄 (2认同)
  • AnyEvent也比POE更快,更少侵入.来自一个前POE用户自己,现在是一个快乐的AnyEvent用户. (2认同)

Rob*_*t P 7

考虑一下Coro.

从其CPAN文档:

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

这包括Coro::AIO"真正的异步文件和目录I/O",这可能是您正在寻找的.


Ada*_*edy 6

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

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

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