在perl中异步写入文件
基本上我想:
>将大量数据从网络读入阵列到内存中. 重复.. 这可能吗?如果这是可能的,我知道我将不得不以某种方式读取下一个数据传递到不同的数组,因为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,sub { my $fh = shift or die "error while opening: $!n"; aio_write $fh,undef,$a,-1,sub { $_[0] > 0 or die "error: $!n"; EV::unloop; }; }; EV::loop EV::LOOP_NONBLOCK; 解决方法
仅供参考,write()s几乎总是异步的.除非您填写操作系统写入缓存. 与启动普通管道相比,使用AIO所获得的收益很少,例如未经测试: my $socket; # INET something my $out = new IO::Handle; open($out,"|bzip2 > ./out") || die; while (1) { my $buf; $socket->recv($buf,64*1024,0); last unless defined $buf and length $buf; print $out $buf; } close($out); 在大多数操作系统下,很难生成足以填满写缓存的大量信息.至少在管道中使用bzip2:HDD的吞吐量比压缩性能(在每秒兆字节范围内)高得多(> 50MB / s). 如果你想在后台运行它或者并行运行多个流,不必担心fork()并使用child()从子节点向主程序发出信号,指示操作是如何进行的. 据我所知,AIO最有用(也可能是唯一有用)的方面是异步读取.这无法以任何其他方式实现.使用AIO只进行异步写入很有意义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |