我有一个作为Mojo :: Command实现的脚本。 它读取一个巨大的文本文件并从中提取数据。该文件包含简单的制表符分隔(C / TSV)记录。每行一条记录。 如何使用Mojo事件循环将这些记录存储在小文件中 - 每个记录一个文件 - 因此我的脚本不会等待存储每条记录,而是继续下一条记录。
这是一个精简的例子:
package My::task;
use Mojo::Base 'Mojolicious::Command';
#in My::task::run
#use Text::CSV to open and read the file
while (!$csv->eof()) {
my $row = $csv->getline($fh)
do_something_time_consuming_and_store_the_record_somewhere($row)
}
我在想Mojo Event Loop可以使用并避免分叉/线程化。 我之前成功使用Parallel::Forker,但我认为Mojo可以提供加速执行的功能。 那可能吗?怎么样?
答案 0 :(得分:1)
这取决于do_something_time_consuming的性质。如果那是你的进程CPU繁忙的东西,那么你正在寻找并行性,事件循环不会试图给你。在那种情况下,您可能希望将每行提供给redis(通过mojo :: redis)并让工作进程使用,处理,存储每条记录。然后吞吐量降低到可以运行的并行工作者数量。
另一方面,如果do_something_time_consuming涉及大量等待,例如发布到Web服务并等待结果,那么事件循环(包括mojo)可能是一个巨大的胜利,并处理您想要的并发。很难猜测哪个非阻塞的UserAgent示例最接近您的场景,因为您缺少细节。要点是创建一个回调,当它从远程服务获得响应时,它会执行您想要的操作(例如store_the_record_somewhere)。