到文件基本上我想:异步写在Perl
- 阅读大量来自网络的数据到一个数组到内存中。
- 异步写入此数组数据,在它到达磁盘之前通过bzip2运行它。
重复..
这可能吗?如果这是可能的,我知道我必须以某种方式将数据的下一个传递读入不同的数组,因为AIO文档声明在异步写入完成之前不得更改此数组。我想将所有的写入操作写入磁盘,因为bzip2的传输比网络读取要花费更多的时间。
这是可行的吗?下面是我认为需要的一个简单例子,但这只是将文件读入数组@a中进行测试。
use warnings;
use strict;
use EV;
use IO::AIO;
use Compress::Bzip2;
use FileHandle;
use Fcntl;
my @a;
print "loading to array...\n";
while(<>) {
$a[$. - 1] = $_;
}
print "array loaded...\n";
my $aio_w = EV::io IO::AIO::poll_fileno, EV::WRITE, \&IO::AIO::poll_cb;
aio_open "./out", O_WRONLY || O_NONBLOCK, 0, sub {
my $fh = shift or die "error while opening: $!\n";
aio_write $fh, undef, undef, $a, -1, sub {
$_[0] > 0 or die "error: $!\n";
EV::unloop;
};
};
EV::loop EV::LOOP_NONBLOCK;
'aio_write'语句中的标量'$ a'与保存输入的数组'@ a'是不同的变量。 – mob 2010-04-12 04:41:20
如果你正在写bzip进行压缩,你甚至不需要AIO。打开一个管道到bzip,然后从套接字读取(异步)并将该数据写入bzip管道。 AnyEvent :: Handle是你所需要的。 – jrockway 2010-04-12 08:49:06