Básicamente me gustaría:escribo de forma asíncrona a presentar en Perl
- Leer una gran cantidad de datos de la red en una matriz en la memoria.
- Escribe asincrónicamente esta matriz de datos, ejecutándola a través de bzip2 antes de que llegue al disco.
repita ..
es esto posible? Si esto es posible, sé que tendré que leer de alguna manera la próxima serie de datos en una matriz diferente, ya que los documentos de AIO dicen que esta matriz no se debe modificar antes de que se complete la escritura asíncrona. Me gustaría poner en segundo plano todas mis escrituras en el disco en orden, ya que el pase bzip2 va a tomar mucho más tiempo que la lectura de la red.
¿Es esto factible? A continuación se muestra un ejemplo simple de lo que creo que se necesita, pero esto simplemente lee un archivo en array @ a para probar.
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;
El escalar '$ a' en la declaración' aio_write' es una variable diferente de la matriz '@ a' que contiene la entrada. – mob
Si está escribiendo en bzip para compresión, ni siquiera necesita AIO. Abra una tubería para bzip, y luego lea desde el zócalo (asíncronamente) y escriba esa información en la tubería bzip. AnyEvent :: Handle es todo lo que necesitas. – jrockway