一个演示文稿由迈克·Goikhman从2003年的Perl会议包括一对黄金数量调查脚本的例子.一个是线程,另一个不是.在运行脚本(打印行注释掉)后,我在非线程版本上的执行时间为0.011秒,在线程版本上的执行时间为2.343(!)秒.是什么导致了时代的惊人差异?
我对Perl中的线程有一些经验并且之前注意到线程创建时间可能特别残酷,但这似乎不是Goikham示例中的瓶颈.
Perl的文档说: 自Perl 5.8以来,线程编程已经可以使用称为解释器线程的模型,它为每个线程提供了一个新的Perl解释器
使用ps -Lm <pid>下面的程序,我可以看到线程并行运行,即它们在不同的核心中同时运行.但即使有4个线程(3个和主要)ps aux只显示一个Perl进程.
use threads;
$thr = threads->new(\&sub1);
$thr2 = threads->new(\&sub1);
$thr3 = threads->new(\&sub1);
sub sub1 {
$i = 0;
while(true){
$i = int(rand(10)) + $i;
}
}
$thr->join;
Run Code Online (Sandbox Code Playgroud) 在Perl中进行多线程处理时应该注意哪些模块?
我想做一些相当低的性能; 我想线程是同时运行多个工作者,每个人都在不同的时间内睡觉.
在使用Oracle DBI编写多线程Perl应用程序时,有没有人知道任何问题或问题?每个线程都有自己与Oracle的连接.
在最长的时间里,我被告知Perl与Oracle不支持多线程.
我有一个perl程序,使用某种形式的并行性会非常有用.
但是,我有相当多变量数据,我并不需要的所有的计划的一部分.
如果我使用perl线程,它会在每次创建新线程时复制所有变量.在我的情况下,这很痛苦.
如果没有复制,我应该使用什么来创建一个新线程?还是有一些更好的线程实现,不复制一切?
我想在Perl中使用线程来提高程序的速度...例如我想在这段代码中使用20个线程:
use IO::Socket;
my $in_file2 = 'rang.txt';
open DAT,$in_file2;
my @ip=<DAT>;
close DAT;
chomp(@ip);
foreach my $ip(@ip)
{
$host = IO::Socket::INET->new(
PeerAddr => $ip,
PeerPort => 80,
proto => 'tcp',
Timeout=> 1
)
and open(OUT, ">>port.txt");
print OUT $ip."\n";
close(OUT);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我们给出了一个ips列表并扫描给定的端口.我想在这段代码中使用线程.有没有其他方法来提高我的代码速度?
谢谢.