为什么Perl通常安装时没有线程支持?

为什么Perl通常安装时没有线程支持?,perl,perlbrew,Perl,Perlbrew,按默认Perl安装,不支持线程。这仅仅是一种传统习惯,还是带有线程支持的Perl安装会产生问题?Perl线程不是通常意义上的线程-它实际上为每个线程运行一个单独的解释器,因此没有共享状态。共享内存模型是使用线程与分叉进程的主要原因,因此很少使用Perl线程 此外,如果您同时使用多个线程的非线程安全模块,则很容易导致崩溃或其他意外行为 有关更多信息,请参阅。使用线程支持编译Perl会由于所有锁定而增加大量开销,即使程序中不使用线程也是如此。我仅通过使用支持线程编译的Perl,测量了一个简单基准测试

按默认Perl安装,不支持线程。这仅仅是一种传统习惯,还是带有线程支持的Perl安装会产生问题?

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

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


有关更多信息,请参阅。

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

因为它不够健壮,性能也不够好,无法作为默认值

除此之外,你还必须考虑CPAN。有太多用C编写的模块没有考虑线程

作为一名前Perl6/Parrot开发者,我以应有的爱和尊重说这番话。Perl5的设计不是从一开始就考虑线程(至少在我参与社区时是这样)

在这一点上,我认为没有足够的人愿意改变它。未来很快就会到来,鹦鹉很早就有了线。在Perl 5生命周期的这一点上破坏其稳定性可能是值得怀疑的


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

来自perl线程教程:

线程支持是Perl编译时选项。这是一件很有趣的事情 在站点上构建Perl时打开或关闭,而不是在 您的程序已编译。如果您的Perl不是用线程编译的 如果已启用支持,则任何使用线程的尝试都将失败

您的程序可以使用配置模块检查线程是否正确 启用


正如@steffen Ultish所说,这是一个性能问题

但是,如果您愿意,可以很容易地安装带有线程和不带线程的Perl,这样您就可以使用更适合给定脚本的版本

perlbrew安装,比如Perl 5.22.1,是:

perlbrew install-multiple 5.22.1 --both=thread

@mpapec我编辑了这个问题。事实上,我在想一些RH版本,但我看到现在已经不是这样了。Perlbrew per default不启用它。是的,但是拥有支持线程的Perl版本并不强迫您使用它。拥有这样一个版本并与不使用线程的脚本一起使用应该没有问题。或者禁用它来强制用户在使用线程之前进行思考(比如:你想使用线程,坏主意,思考并重新安装perl?),这不是强制你使用或不使用它,而是影响健壮性和性能的内部差异,特别是当你不使用它时。我不确定我是否理解这一点,或者最好说我希望我是误解了。你是说如果我运行一个不使用线程的perl模块,我将获得不同的性能级别,这取决于我运行的perl是用-DuseThreads参数编译的吗?我知道perl线程并不是最好的线程,但如果程序从未加载线程,我绝不会想到解释器会受到这样的打击。你可能认为他们会打开或关闭相应的解释器行为,这样当线程未被使用时,锁定就不会发生?@dsollen:你理解得对。如果Perl是在支持线程的情况下编译的,那么它需要使几个内部结构安全,以防并行使用,例如锁定等。这意味着开销。这不是Perl所特有的,也就是说,在早期多核CPU使用不多的时候,在各种UNIX版本中使用单核内核是很常见的,因为多核内核只会带来更多的开销,因此意味着性能更低。哦,我并不奇怪以线程安全的方式进行解释需要更长的时间。我很惊讶他们没有办法在线程安全模式和非线程安全模式之间切换,因此如果代码中没有“使用线程”,那么运行时就没有线程安全。但回顾过去,我意识到,在一种完全解释的语言中,您无法确定线程将在运行之前被用来决定使用哪个解释器;我对汇编语言的偏见正在显现。不过,我认为至少为线程编译的perl会有一个-no-thread cmd行参数来使用更快的解释器,但如何选择一个或另一个perl?如果需要线程,显然没有选择。或者,一个人仍然可以安装线程,因为他知道自己将不得不承受性能损失(正如Steffen Ullrich所说)。如果您不需要线程,最好不要使用它们。