use*_*322 8 perl multithreading multicore
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)
ike*_*ami 13
"Perl解释器"指的是Perl代码执行的环境.从用户的角度来看,这主要是符号表和其中的全局变量,但它还包括一系列内部变量(例如在解析期间使用的那些变量,当前的op等).
是的,每个线程都有一个Perl解释器.
是的,Perl线程是系统线程.
可以将"Perl解释器"视为可以创建任意数量实例的类.*Perl将此称为Multiplicity.有关如何在应用程序中嵌入Perl解释器的信息,请参见perlembed.
* - 需要-Dusemulitplicity在构建Perl时使用,这是-DusethreadsPerl中添加线程支持的方式.否则,使用一大堆全局变量而不是"类".
为了放大ikegami对第三个问题的回答,Perl为每个操作系统线程创建了一个完整的解释器整个状态.这意味着将复制所有数据和代码.在不利方面,这使得创建线程变慢并且Perl线程内存饥饿.
在好的方面,线程彼此隔离,这使得编写线程安全代码变得更加容易.例如,大多数模块本身就是线程安全的,而作者不必做任何特殊的事情或根本不考虑线程.
这是Perl的第二个线程实现.第一个5.005线程是一个更传统的线程模型,其中线程共享代码和全局变量.它效果不佳.更糟糕的是,它使大多数CPAN模块无用,因为它们的不协调的全局变量在各种线程中相互冲突.
它是如何可能的是一种被称为"多重性"的东西,池上提到并解释过.这最初源于在另一个C或C++程序中嵌入Perl解释器的愿望.它需要改变Perl的工作方式,因此它可以隔离每个解释器对象的所有全局数据(全局变量和编译代码),而不是假设它是唯一在该进程中运行的Perl解释器.从那里开始,Perl解释器中的多个Perl解释器被用于fork在Windows上进行模拟.最后,5.6个线程构建在广泛的工作之上.
| 归档时间: |
|
| 查看次数: |
1835 次 |
| 最近记录: |