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

Performance 如何在Perl中使用异步编程?,performance,perl,Performance,Perl,在Perl中是否有一种简单的异步方法?对于Apache应用程序,我有以下逻辑: get request process request write to log return 我想做的是让“写入日志”部分是异步的,这样我就可以尽快完成“返回”部分。不幸的是,这通常需要框架,但还有一个不断增长的替代方案(我想首先尝试)称为 有关学习POE的更多信息,请参阅。POE是一个框架,它会吞噬整个应用程序。它看起来也不像Perl,而且非常突出。我相信对于您的典型应用程序来说,这是一个很大的学习曲线 Any

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

get request
process request
write to log
return

我想做的是让“写入日志”部分是异步的,这样我就可以尽快完成“返回”部分。

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

有关学习POE的更多信息,请参阅。POE是一个框架,它会吞噬整个应用程序。它看起来也不像Perl,而且非常突出。我相信对于您的典型应用程序来说,这是一个很大的学习曲线

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


对于您的特定问题,您可以使用或

您可以使用perl中的线程。 创建一个处理日志的线程。 该线程将有一个缓冲区,主线程可以将消息添加到该缓冲区中

从其CPAN文档中:

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


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

返回之前是否确实需要写入日志

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

似乎您真正想要的是日志记录不停止返回,清理处理程序似乎完全不需要异步就可以这样做。

许多core Engine for Perl(MCE)附带了几个示例,演示了在多个内核之间并行执行矩阵乘法。自述文件还包含基准测试结果


谢谢,我想知道我是否遗漏了任何明显的内容,但找不到。由于这是Apache应用程序的一部分,因此两种解决方案都不具有吸引力。感谢您,您可以使用一个简单的非阻塞套接字将数据发送到POE日志写入守护进程。而且,正如daotoad所说,只要您限制每个文件一个写入过程,那么您就可以只使用非阻塞HandleanEvent,它也比POE更快、更少侵入性。从以前的POE用户到现在的happy AnyEvent用户。为什么不使用非阻塞调用来处理脚本的写入日志部分?您所说的“Apache应用程序”是什么意思?mod_perl?CGI?PSGI?使用Apache作为前端的独立perl服务器?您可能是对的,但它现在的设计很糟糕,它需要它利用它现在拥有一些数据,而不仅仅是简单的日志记录。