8

Perlbrew根据默认 Perl 安装,不支持线程。这只是一个遗留习惯还是带有线程支持的 Perl 安装会产生问题?

4

5 回答 5

15

由于所有的锁定,使用线程支持编译 Perl 会增加很多开销,即使您在程序中不使用线程也是如此。仅使用带有线程支持的 Perl 编译,我测量了一个简单基准测试的大约 15% 的开销。

于 2014-05-15T06:57:26.620 回答
4

因为它不够健壮和性能不足以成为默认值。

除此之外,您还必须考虑 CPAN。用 C 语言编写的模块太多,不关心线程。

作为一名前 Perl6 / Parrot 开发人员,我怀着应有的爱和尊重这样说。Perl5 从一开始就没有考虑到线程(至少在我参与社区时)。

在这一点上,我认为没有足够的人愿意改变它。未来将是 Perl6,Parrot 很早就有了线程。在 Perl 5 生命周期的这个阶段破坏 Perl 5 的稳定性可能是值得怀疑的。

Perl 在这方面并不是独一无二的,Linux 很长一段时间都是如此(因为必须处理一个很大的内核锁)。大多数项目都是这样开始的,但有些项目在解决它之前比其他项目更进一步。

于 2014-05-15T07:51:33.190 回答
3

正如@steffen-ultisch 所说,这是一个性能问题。

但是,如果您愿意,可以轻松地安装带线程和不带线程的 Perl,因此您可以使用更适合给定脚本的版本。

perlbrew 安装,比如 Perl 5.22.1,是:

perlbrew install-multiple 5.22.1 --both=thread
于 2016-01-14T16:44:41.183 回答
2

来自 perl 线程教程:

基本线程支持

线程支持是 Perl 编译时的选项。它是在您的站点上构建 Perl 时打开或关闭的东西,而不是在编译您的程序时。如果您的 Perl 没有在启用线程支持的情况下编译,那么任何使用线程的尝试都会失败。

您的程序可以使用 Config 模块来检查是否启用了线程。

于 2014-05-15T08:05:41.917 回答
1

Perl 线程不是通常意义上的线程——它实际上为每个线程运行一个单独的解释器,因此没有共享状态。共享内存模型是使用线程与分叉进程的主要原因,因此很少使用 Perl 线程。

此外,如果您同时使用来自多个线程的非线程安全模块,则很容易导致崩溃或其他意外行为。

有关更多信息,请参见http://perldoc.perl.org/threads.html

于 2014-05-15T06:14:40.667 回答