2

我有一个作为 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 可以提供什么来加速执行。那可能吗?如何?

4

1 回答 1

1

这取决于 do_something_time_sumption 的性质。如果那是您的进程 CPU 繁忙的事情,那么您正在寻找并行性,而事件循环不会尝试为您提供。在这种情况下,您可能希望将每一行提供给 redis(通过 mojo::redis)并让工作进程消费、处理、存储每条记录。然后吞吐量取决于您可以运行多少并行工作程序。

另一方面,如果 do_something_time_sumption 涉及大量等待,例如发布到 Web 服务并等待结果,那么事件循环(包括 mojo 的)可能是一个巨大的胜利,并处理您想要的并发。很难猜测哪个非阻塞 UserAgent 示例最接近您的场景,因为您缺乏细节。要点是创建一个回调,当它从远程服务获得响应时,它会执行您想要的操作(例如 store_the_record_somewhere)。

于 2013-06-30T11:01:39.240 回答