请介绍Perl或Ruby中的多处理库

fre*_*ara 5 ruby python perl

在python中我们可以使用多处理模块.如果在Perl和Ruby中有类似的库,你会教它吗?如果你能包括一个简短的样本,我将不胜感激.

Sas*_*gov 12

红宝石:

Perl的:

此外,Perl的线程是本机操作系统线程,因此您可以使用它们来利用多个内核.

  • 可悲的是,Python也是GIL的受害者. (2认同)
  • 我不认为Ruby会支持本机操作系统级别的线程.Matz说,他正在通过某种"迷你流程"来看待并行处理. (2认同)

Sin*_*nür 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__
Run Code Online (Sandbox Code Playgroud)

使用线程的以下版本不会对创建的线程数使用限制(因为我不知道如何):

#!/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__
Run Code Online (Sandbox Code Playgroud)

有趣的是:

TimeThis :  Command Line :  t.pl
TimeThis :  Elapsed Time :  00:00:01.281
Run Code Online (Sandbox Code Playgroud)

  • Perl的线程在启动时和内存中都很昂贵.它们最好是持续使用,而不是像上面那样一次性使用 - 但为此,单独的流程通常会更好.Perl 6语法提供了许多自然使用的多处理领域......总有一天. (2认同)