小编ala*_*lan的帖子

在特定示例中了解perl中的异步

我必须编写一个脚本来并行获取一些URL并做一些工作.在过去,我一直习惯于Parallel::ForkManager这样的事情,但现在我想学习一些新东西并尝试使用AnyEvent(和AnyEvent::HTTPAnyEvent::Curl::Multi)进行异步编程......但是我在理解AnyEvent时遇到问题并编写了一个脚本应该:

  • 打开一个文件(每一行都是一个单独的URL)
  • (从现在开始并行,但有10个并发请求的限制)
  • 一行一行读取文件(我不想将整个文件加载到内存中 - 它可能很大)
  • 为该URL发出HTTP请求
  • 阅读回复
  • 相应地更新MySQL记录
  • (下一个文件行)

我已阅读了许多手册和教程,但我仍然很难理解阻塞和非阻塞代码之间的差异.我在http://perlmaven.com/fetching-several-web-pages-in-parallel-using-anyevent找到了类似的脚本,其中Szabo先生解释了基础知识,但我仍然无法理解如何实现以下内容:

...
open my $fh, "<", $file;
while ( my $line = <$fh> )
{
# http request, read response, update MySQL
}
close $fh
...
Run Code Online (Sandbox Code Playgroud)

...并在这种情况下添加并发限制.

我非常感谢你的帮助;)

UPDATE

根据池上的建议,我Net::Curl::Multi试了一下.我对结果非常满意.经过多年的使用Parallel::ForkManager只是为了同时抓取成千上万的URL,Net::Curl::Multi似乎很棒.这是我while在filehandle 上循环的代码.它似乎应该工作,但考虑到这是我第一次写这样的东西,我想请更多有经验的Perl用户看一看,告诉我是否有一些潜在的错误,我错过了什么等等.另外,如果我可能会问:因为我不完全理解Net::Curl::Multi并发是如何工作的,请告诉我是否应该在将MySQL UPDATE命令(via DBI)置于RESPONSE循环内时出现任何问题(除了更高的服务器负载之外 - 我希望最终脚本能够运行约50名并发N::C::M工人,可能更多).

#!/usr/bin/perl

use Net::Curl::Easy  qw( :constants );
use Net::Curl::Multi qw( ); …
Run Code Online (Sandbox Code Playgroud)

perl asynchronous anyevent

5
推荐指数
1
解决办法
673
查看次数

标签 统计

anyevent ×1

asynchronous ×1

perl ×1