Python 请介绍Perl或Ruby中的多处理库
在python中,我们可以使用多处理模块。 如果Perl和Ruby中有类似的库,您会教它吗? 如果您能提供一个简短的示例,我将不胜感激。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;
另外,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附带的内容 以下是两篇关于使用光纤的有趣文章:
#!/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();