请介绍一个Perl或Ruby的多处理库

5 投票
5 回答
2642 浏览
提问于 2025-04-15 11:33

在Python中,我们可以使用多进程模块来同时处理多个任务。如果在Perl和Ruby中也有类似的库,你能教我一下吗?如果能附上简单的示例代码,我会非常感激。

5 个回答

3

可以看看 Coro,它为Perl提供了协程。

以下是作者文档中的一段摘录……

这个模块集合主要管理“继续”功能,通常以协作线程的形式出现(也叫做协程,文档中简称为“coro”)。它们和内核线程有点像,但通常不会在同一时间并行运行,即使在多核机器上也是如此。这个模块提供的线程类型还保证了,除非必要,否则不会在线程之间切换,而是在你程序中容易识别的点进行切换,因此锁定和并行访问的问题很少出现,这使得线程编程比其他线程模型安全和简单得多。

与所谓的“Perl线程”不同(其实它们并不是真正的线程,只是将Windows进程模拟移植到Unix上,因此表现得像进程),Coro提供了一个完整的共享地址空间,这让线程之间的通信变得非常简单。而且Coro的线程运行速度也很快:在你的Perl中禁用Windows进程模拟代码并使用Coro,可以让你的程序速度提高两到四倍。在单核上进行的并行矩阵乘法基准测试,比在四核的Perl伪线程上运行快300多倍。


如果你想在Ruby中找到类似的东西,可以看看 Fiber,它是Ruby 1.9自带的。

这里有两篇关于使用Fiber的有趣文章:

还有一个 用于Perl的Fiber,它使用了Coro。以下是一些关于Perl中Fiber的文章(用日语):

12

Ruby:

Perl:

另外,Perl的线程是操作系统的原生线程,所以你可以直接使用这些线程来充分利用多个核心。

9

在Perl中,你有很多选择。其中一个选择是使用进程,下面有个示例。我需要查一下如何用线程写出类似的程序,不过你可以看看这个链接 http://perldoc.perl.org/perlthrtut.html,它应该能给你一些启发。

#!/usr/bin/perl

use strict;
use warnings;

use Parallel::ForkManager;

my @data = (0 .. 19);

my $pm = Parallel::ForkManager->new(4);

for my $n ( @data ) {
    my $pid = $pm->start and next;
    warn sprintf "%d^3 = %d\n", $n, slow_cube($n);
    $pm->finish;
}

sub slow_cube {
    my ($n) = @_;

    sleep 1;
    return $n * $n * $n;
}

__END__

下面这个使用线程的版本没有限制创建的线程数量(因为我不知道怎么做):

#!/usr/bin/perl

use strict;
use warnings;

use threads;

my @data = (0 .. 19);
my @threads = map { 
    threads->new( {context => 'list' }, \&slow_cube, $_ )
} @data;

for my $thr ( @threads ) {
    my ( $n, $ncubed ) = $thr->join;
    print "$n^3 = $ncubed\n";
}

sub slow_cube {
    my ($n) = @_;

    sleep 1;
    return $n, $n * $n * $n;
}

__END__

有趣的是:

TimeThis :  Command Line :  t.pl
TimeThis :  Elapsed Time :  00:00:01.281

撰写回答