Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 请介绍Perl或Ruby中的多处理库_Python_Ruby_Perl - Fatal编程技术网

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

Python 请介绍Perl或Ruby中的多处理库,python,ruby,perl,Python,Ruby,Perl,在python中,我们可以使用多处理模块。 如果Perl和Ruby中有类似的库,您会教它吗? 如果您能提供一个简短的示例,我将不胜感激。Ruby: Perl: 另外,Perl的线程是本机操作系统线程,因此您可以使用这些线程来利用多核。使用Perl,您可以选择。一种选择是使用如下流程。我需要查找如何使用线程编写类似程序,但应该会给您一个想法 #!/usr/bin/perl use strict; use warnings; use Parallel::ForkManager;

在python中,我们可以使用多处理模块。 如果Perl和Ruby中有类似的库,您会教它吗? 如果您能提供一个简短的示例,我将不胜感激。

Ruby:

Perl:


另外,Perl的线程是本机操作系统线程,因此您可以使用这些线程来利用多核。

使用Perl,您可以选择。一种选择是使用如下流程。我需要查找如何使用线程编写类似程序,但应该会给您一个想法

#!/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__
以下使用线程的版本对创建的线程数没有限制(因为我不知道如何创建):

有趣的是:

TimeThis :  Command Line :  t.pl
TimeThis :  Elapsed Time :  00:00:01.281
查看哪些提供了到Perl的协同路由

以下是作者文档的摘录

此模块集合通常以协作线程的形式(也称为coro,或在文档中简称为“coro”)管理连续性。它们类似于内核线程,但(通常)即使在SMP机器上也不会同时并行运行。此模块提供的特定风格的线程还保证,除非必要,否则它不会在程序中容易识别的点上在线程之间切换,因此锁定和并行访问很少是一个问题,这使得线程编程比使用其他线程模型更安全、更容易

与所谓的“Perl线程”(实际上不是真正的线程,而只是移植到unix的windows进程模拟,因此充当进程)不同,Coro提供了完整的共享地址空间,这使得线程之间的通信非常容易。Coro的线程也很快:在perl中禁用Windows进程模拟代码并使用Coro很容易使程序的速度提高两到四倍。并行矩阵乘法基准测试在单核上的运行速度比使用所有四个核的四核上的perl伪线程快300倍以上


对于Ruby中类似于上面的内容,请查看Ruby1.9附带的内容

以下是两篇关于使用光纤的有趣文章:

还有一种使用Coro的方法。以下是一些关于Fiber for Perl的文章(日语):


看看这个漂亮的Perl并行处理库摘要页面。我喜欢Parallel::Forker,它是一个比旧的Parallel::ForkManager更现代、功能更强大的库,并且具有更多的特性,如发送子进程信号。我在多个项目中使用过它,它的工作原理完全符合预期。下面是一个如何使用它的示例:

#!/usr/bin/env perl

use strict;
use warnings;
use Parallel::Forker;

my $forker = Parallel::Forker->new(use_sig_child => 1, max_proc => 4);
$SIG{CHLD} = sub {
    Parallel::Forker::sig_child($forker);
};
$SIG{TERM} = sub {
    $forker->kill_tree_all('TERM') if $forker and $forker->in_parent;
    die "Exiting child process...\n";
};
# an example
for (1..10) {
    $forker->schedule(run_on_start => sub {
        # all child process code to run here
    })->ready();
}
# wait for all child processes to finish
$forker->wait_all();

希望这能帮助您

了解ruby

只是出于好奇,您搜索过了吗?非常感谢您的回答。我必须自己写并行ForkManager的pro进程返回更多结果的部分吗?这很麻烦。如果我抛出一个安排和数据的处理功能,它会在未经允许的情况下被分散,并且如何使用结果的安排返回到可能的状态?请您澄清上面的评论好吗?不缺少“多处理模块”或cpan上的描述。遗憾的是,Python也是GIL的牺牲品。JRuby的线程做得很好。我相信IronRuby做的很好。当ruby获得更好的本机VM时,他们就可以很好地执行线程了。我认为ruby永远都不会支持本机OS级线程。Matz说他正在研究通过某种“迷你进程”来进行并行处理。@TM:是的,但Python 2.6有多处理库,虽然效率不如线程,但允许并发处理。Perl的线程在启动时间和内存方面都很昂贵。它们最好是在持续的基础上使用,而不是像上面那样一次性使用——但对于这一点,单独的流程通常会更好。Perl 6语法为多处理提供了许多自然使用的领域…总有一天。另一个选项是使用forks()通过IPC模拟线程,IPC在POSIX系统上实际上非常快。
#!/usr/bin/env perl

use strict;
use warnings;
use Parallel::Forker;

my $forker = Parallel::Forker->new(use_sig_child => 1, max_proc => 4);
$SIG{CHLD} = sub {
    Parallel::Forker::sig_child($forker);
};
$SIG{TERM} = sub {
    $forker->kill_tree_all('TERM') if $forker and $forker->in_parent;
    die "Exiting child process...\n";
};
# an example
for (1..10) {
    $forker->schedule(run_on_start => sub {
        # all child process code to run here
    })->ready();
}
# wait for all child processes to finish
$forker->wait_all();