2010-02-09 52 views
5

有没有一种简单的方法来在Perl中进行异步?我有以下逻辑Apache的应用:如何在Perl中使用异步编程?

get request 
process request 
write to log 
return 

我想要做的是有“写入日志”部分是异步,让我可以尽快做“回归”的一部分。

+1

为什么不使用非阻塞调用来处理登录脚本的一部分写? – daotoad 2010-02-09 22:04:49

+0

“Apache应用程序”是什么意思? mod_perl的? CGI? PSGI?以Apache作为前端的独立perl服务器? – dolmen 2012-02-11 12:06:38

回答

7

不幸的是,这通常需要POE框架,但也有一个不断增长的替代品(我想先尝试)称为AnyEvent

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

AnyEvent是基于异步任务的简单继续,你应该能够很好地解决CPAN文档问题。

为了您的具体问题,你可以使用AnyEvent's AIOPOE's Read Write wheel

+0

谢谢,想知道我是否错过了任何明显的东西,但找不到任何东西。由于这是Apache应用程序的一部分,因此这两种解决方案都不具吸引力谢谢你 – Timmy 2010-02-09 21:14:44

+2

你可以使用一个简单的非阻塞套接字将数据发送到POE日志写入守护进程。并且,正如daotoad所说,只要你限制每个文件的一个写入过程,那么你可能只需要使用一个非阻塞句柄。 – 2010-02-09 22:16:17

+2

AnyEvent比POE更快速,侵入性更小。从前POE用户自己,现在是一个快乐的AnyEvent用户。 – dolmen 2012-02-11 12:04:54

3

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

7

考虑看看Coro

从它的CPAN文档:

不同于所谓的“Perl的线程”(这不是真正的线程,但只有Windows过程仿真(详情参见同一个名字的部分移植到UNIX) ,并且像进程一样),Coro提供了完整的共享地址空间,这使得线程之间的通信变得非常简单。而且Coro的线程速度也很快:禁用perl中的Windows进程仿真代码并使用Coro可以轻松地为您的程序增加两到四倍的速度。并行矩阵乘法基准测试在单个内核上的运行速度比使用全部四个内核的四核上的perl虚拟线程快300倍以上。

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

6

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

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

看来你真的想要的是记录不停止返回,清理处理程序似乎这样做,而不需要异步。

+0

你可能是对的,但现在这是一个糟糕的设计,它需要利用它现在有一些数据的事实,而不仅仅是简单的日志记录。 – Timmy 2010-02-10 03:51:15