Perl、Parallel::ForkManager和线程中哪个更快? [英] Which is faster in perl, Parallel::ForkManager or threads?

查看:18
本文介绍了Perl、Parallel::ForkManager和线程中哪个更快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

线程被视为轻量级进程。它们是否真的会比同等数量的派生进程运行得更快?

推荐答案

线程被视为轻量级进程。

哦,不,他们不是。Perl线程模型与Windows系统上的fork模拟交织在一起。在许多方面,在Perl中派生新线程的行为与派生新进程的行为相同:产生的两个控制流都在单独的Perl解释器中运行。也就是说,复制整个程序状态以生成新的解释器。

它们的运行速度真的会快于同等数量的派生进程吗?

不太可能。派生新线程是在软件端进行的,由Perl完成。分叉是由操作系统(在*nix系统上)完成的,它可以利用写入时复制(copy-on-write)技术。这可以使分叉更便宜。一个小测试:

$ time perl -Mthreads -e'threads->new(sub{threads->exit})->detach for 1 .. 5E3'
real    0m10.651s
user    0m16.421s
sys     0m1.904s
$ time perl -Mthreads -e'fork || exit  for 1 .. 5E3'
real    0m2.347s
user    0m0.032s
sys     0m0.516s

这会产生5000个线程/进程。在Linux上进行测试时,生成新进程的速度会更快。在其他操作系统上可能不是这种情况。

这并不是说Perl线程毫无用处:它们提供了许多好处,比如可选的共享数据、传递数据的队列、管理共享资源的信号量、线程可以返回值等。在进程之间共享数据(不使用模块)的最简单方法是pipe内置,它创建两个链接的文件句柄。


不要混淆线程这两个词的不同解释:

  • 内核线程是硬件级执行行。它们通常不是计划的,而是并行运行的。每个处理器至少有一个线程。

  • 操作系统线程由操作系统提供。现代操作系统自行调度线程执行(抢占式调度)。通常,所有数据都是共享的,线程只是有不同的堆栈。Perl线程选择不强调共享属性。

    /li>
  • 软件线程,也称为绿色线程由软件本身调度,通常通过协作调度。许多具有廉价线程的语言都选择这种模式,例如Go。两个绿色线程不必并行运行。协程和绿色线程实际上是相关的概念:两者都描述并发执行路径。

    软件线程有时可以比操作系统线程运行得更快,因为软件可以在程序中方便的位置进行上下文切换。(OS线程或进程之间的抢占式切换代价更高,因为OS内核必须定期运行,并且处理器高速缓存和寄存器必须在每次上下文切换时使用另一个线程的数据进行更新。在编写常规应用程序代码时这并不重要)

    Perl线程通常不使用此模型,但是存在用于协同例程的模块(Coro)。

这篇关于Perl、Parallel::ForkManager和线程中哪个更快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆