Perlbrew根据默认 Perl 安装,不支持线程。这只是一个遗留习惯还是带有线程支持的 Perl 安装会产生问题?
5 回答
由于所有的锁定,使用线程支持编译 Perl 会增加很多开销,即使您在程序中不使用线程也是如此。仅使用带有线程支持的 Perl 编译,我测量了一个简单基准测试的大约 15% 的开销。
因为它不够健壮和性能不足以成为默认值。
除此之外,您还必须考虑 CPAN。用 C 语言编写的模块太多,不关心线程。
作为一名前 Perl6 / Parrot 开发人员,我怀着应有的爱和尊重这样说。Perl5 从一开始就没有考虑到线程(至少在我参与社区时)。
在这一点上,我认为没有足够的人愿意改变它。未来将是 Perl6,Parrot 很早就有了线程。在 Perl 5 生命周期的这个阶段破坏 Perl 5 的稳定性可能是值得怀疑的。
Perl 在这方面并不是独一无二的,Linux 很长一段时间都是如此(因为必须处理一个很大的内核锁)。大多数项目都是这样开始的,但有些项目在解决它之前比其他项目更进一步。
正如@steffen-ultisch 所说,这是一个性能问题。
但是,如果您愿意,可以轻松地安装带线程和不带线程的 Perl,因此您可以使用更适合给定脚本的版本。
perlbrew 安装,比如 Perl 5.22.1,是:
perlbrew install-multiple 5.22.1 --both=thread
来自 perl 线程教程:
线程支持是 Perl 编译时的选项。它是在您的站点上构建 Perl 时打开或关闭的东西,而不是在编译您的程序时。如果您的 Perl 没有在启用线程支持的情况下编译,那么任何使用线程的尝试都会失败。
您的程序可以使用 Config 模块来检查是否启用了线程。
Perl 线程不是通常意义上的线程——它实际上为每个线程运行一个单独的解释器,因此没有共享状态。共享内存模型是使用线程与分叉进程的主要原因,因此很少使用 Perl 线程。
此外,如果您同时使用来自多个线程的非线程安全模块,则很容易导致崩溃或其他意外行为。
有关更多信息,请参见http://perldoc.perl.org/threads.html。