The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

AnyEvent::MultiDownload - 非阻塞的多线程多地址文件下载的模块

SYNOPSIS

这是一个非阻塞的多线程多地址文件下载的模块, 可以象下面这个应用一样, 同时下载多个文件, 并且整个过程都是异步事件触发, 不会阻塞主进程.

下面是个简单的例子, 同时从多个地址下载同一个文件.

use AE;
use AnyEvent::MultiDownload;

my @urls = (
    'http://mirrors.163.com/ubuntu-releases/12.04/ubuntu-12.04.2-desktop-i386.iso',
    'http://releases.ubuntu.com/12.04.2/ubuntu-12.04.2-desktop-i386.iso',
);


my $cv = AE::cv;
my $MultiDown = AnyEvent::MultiDownload->new( 
    url     => pop @urls, 
    mirror  => \@urls, 
    path  => '/tmp/ubuntu.iso',
    block_size => 1 * 1024 * 1024, # 1M
    on_block_finish => sub {
        my ($hdr, $seg, $size, $chunk, $cb) = @_;
        $cb->(1);
    },
    on_finish => sub {
        my $len = shift;
        $cv->send;
    },
    on_error => sub {
        my $error = shift;
        $cv->send;
    }
)->start;


$cv->recv;

下面是异步同时下载多个文件的实例. 整个过程异步.

use AE;
use AnyEvent::MultiDownload;


my $cv = AE::cv;


$cv->begin;
my $MultiDown = AnyEvent::MultiDownload->new( 
    url     => 'http://xxx1',
    content_file  => "/tmp/file2",
    on_finish => sub {
        my $len = shift;
        $cv->end;
    },
    on_error => sub {
        my $error = shift;
        $cv->end;
    }
);
$MultiDown->start;


$cv->begin;
my $MultiDown1 = AnyEvent::MultiDownload->new( 
    content_file  => "/tmp/file1",
    url     => 'http://xxx', 
    on_finish => sub {
        my $len = shift;
        $cv->end;
    },
    on_error => sub {
        my $error = shift;
        $cv->end;
    }
);
$MultiDown1->start;


$cv->recv;

以上是同时下载多个文件的实例.

METHODS

创建一个多下载的对象.

my $MultiDown = AnyEvent::MultiDownload->new( 
        url     => 'http://mirrors.163.com/ubuntu-releases/12.04/ubuntu-12.04.2-desktop-i386.iso', 
        mirror  => ['http://mirrors.163.com/ubuntu-releases/12.04/ubuntu-12.04.2-desktop-i386.iso', 'http://releases.ubuntu.com/12.04.2/ubuntu-12.04.2-desktop-i386.iso'],
        content_file  => $content_file,
        block_size => 1 * 1024 * 1024, # 1M
        on_block_finish => sub {
            my ($hdr, $seg_path, $size, $chunk,  $cb) = @_;
            $cb->(1);
        },
        on_finish => sub {
            my $len = shift;
            $cv->send;
        },
        on_error => sub {
            my $error = shift;
            $cv->send;
        },
);

start()

事件开始的方法. 只有调用这个函数时, 这个下载的事件才开始执行.

AUTHOR

扶凯 fukai iakuf@163.com