线程被视为轻量级进程。他们实际上运行的速度是否会比分叉进程数量相等?哪个更快perl,Parallel :: ForkManager或线程?
回答
线程被视为轻量级进程。
哦不,他们不是。 Perl线程模型与Windows系统上的fork
嘲讽交织在一起。在许多方面,在Perl中产生一个新线程的行为与分离新进程的行为相同:两个结果控制流在之间运行,单独的perl口译为。也就是说,整个程序状态是复制来做一个新的解释器。
它们实际上运行的速度是否比相同数量的分叉进程快?
不太可能。产生一个新的线程是软件方面的,并由perl完成。分叉是由操作系统(在* nix系统上)完成的,它可以利用写入时复制技术。这可以使分叉更便宜。一个小测试:
$ 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
这产生了五千个线程/进程。当它在Linux上进行测试时,产生一个新进程变得更快。其他操作系统可能不是这种情况。
这并不是说Perl线程将毫无用处:它们提供了许多好处,例如可选的共享数据,传递数据的队列,管理共享资源的信号量,线程可以返回的值等等。共享数据的最简单方法进程间(不使用模块)是内置的pipe
,它创建两个链接的文件句柄。
不要混淆字线程其彼此不同的解释:
内核线程是硬件级别的执行线。他们不是普遍安排,而是平行运行。每个处理器至少有一个线程。
操作系统线程由操作系统提供。现代操作系统自己调度线程执行(抢先调度)。通常,所有数据都是共享的,线程只有不同的堆栈。 Perl线程选择不强调共享属性。
软件线程,也绿色线程由软件本身调度,通常通过协作调度。许多具有廉价线程的语言选择此模型,例如走。两条绿线不一定平行运行。协程和绿线实际上是相关的概念:都描述了并发的执行路径。
软件线程有时可能比操作系统线程运行得更快,因为软件可以在程序中方便的地方使上下文切换。(操作系统线程或进程之间的抢先式切换更为昂贵,因为操作系统内核必须定期运行,并且处理器高速缓存和寄存器将不得不使用每个上下文切换中的另一个线程的数据进行更新。编写常规应用程序代码)
Perl线程通常不使用此模型,但存在用于协程的模块(
Coro
)。
“哦,不,它们不是,Perl线程模型与Windows系统上的叉子模拟相互交织。”并非如此。 'fork'在Windows上使用线程,而不是相反。 – ikegami
你的基准是荒谬的毫无价值。你的结论是分叉更快无法从中得出结论。 1)这是一个非常糟糕的线程模型,所以你没有测试线程,你正在线程错误的代码。 2)叉子除了前期成本之外还有很多成本。 – ikegami
@ikegami IIRC,通过线程实现对Windows上'fork'内建的支持。是不是perl中的代码部分重用于线程支持,因此将fork类语义带入Perl线程模型?是的,该基准并不考虑线程模块暗示的间接性。但我不明白它是如何不显示*开始*在我的特定perl/OS/PC组合上,并行计算通过'fork'更便宜。 – amon
- 1. 如何加快perl中的Parallel :: ForkManager
- 2. perl Parallel :: ForkManager卡在这个脚本中?
- 3. Perl使用Parallel :: ForkManager和WWW :: Mechanize
- 4. Perl Parallel :: ForkManager wait_all_children()需要很长时间
- 5. Perl Parallel ::具有DBI数据库处理程序的ForkManager
- 6. Inline :: Java与Parallel :: ForkManager冲突
- 7. Perl:使用Parallel :: ForkManager存储许多文件内容
- 8. Perl ForkManager子STDOUT子程序
- 9. 如何使用Parallel :: ForkManager管道?
- 10. 在Perl中,如何验证Parallel :: ForkManager的每个孩子完成其作业?
- 11. 哪个更好?线程或进程
- 12. 哪个更快,get()或merge()?
- 13. 哪个更快? NSXMLParser或KissXML
- 14. 哪个更快:document.location.pathname或myOwnObj.pathname?
- 15. 哪个更快,XPath或Regexp?
- 16. 哪个更快RegisterStartupScript或RegisterClientScriptBlock?
- 17. 哪个更快,GDI +或libpng?
- 18. write或printf,哪个更快?
- 19. 哪个更快? Statement或PreparedStatement
- 20. 哪个更快 - WebSockets或Ajax?
- 21. 哪个更有效率的Oracle SQL? PARALLEL CREATE TABLE AS SELECT或PARALLEL INSERT?
- 22. 如何使用Parallel :: ForkManager完成重新启动子进程
- 23. 线程或JMS哪个更好?
- 24. 单线程'gnu parallel'
- 25. perl,python,parallel processing,fork
- 26. parallel :: forkmanager ....如何在出口传递2个变量
- 27. 哪个更快?插入或更新?
- 28. 更新或删除哪个更快?
- 29. 哪个更快?
- 30. Perl forkmanager删除数组值
尝试和衡量... –
不成熟的优化是所有邪恶的根源。编写符合问题域的程序。你甚至可能没有线程与进程的瓶颈。 – Jens
你的代码运行速度太慢了吗?如果没有,那么没有什么可以解决的。如果是这样的话,除了多处理机制之外还有很多地方可以看。 – Borodin