【问题标题】:What is the difference between forking and threading in a background process?后台进程中的分叉和线程有什么区别?
【发布时间】:2012-05-19 16:31:59
【问题描述】:
阅读它声明的 spawn gem 的文档:
默认情况下,spawn 将使用 fork 生成子进程。你可以
通过告诉 spawn 方法何时将其配置为执行线程
您调用它或通过配置您的环境。例如,这是
如何告诉 spawn 在调用中使用线程,
使用 fork 或 thread 有什么区别,任何一个决定的影响是什么,我如何知道使用哪个?
【问题讨论】:
标签:
ruby-on-rails
ruby
background-process
【解决方案1】:
线程意味着您在同一进程的另一个线程中运行代码,而分叉意味着您分叉一个单独的进程。
线程一般意味着您将使用更少的内存,因为您不会有一个单独的应用程序实例(如果您有一个可写的 ruby 副本,例如 ree,则此优势会减弱)。线程之间的通信也容易一些。
根据您的 ruby 解释器,ruby 可能无法有效地使用额外的内核(jruby 擅长这一点,MRI 更差)所以产生一堆额外的线程会影响您的 web 应用程序的性能,并且不会充分利用您的资源 - MRI 一次只运行一个线程
分叉创建单独的 ruby 实例,以便您更好地利用多个内核。您也不太可能对您的主应用程序产生不利影响。分叉时需要小心一点,因为您在分叉时共享打开的文件描述符,因此您通常希望重新打开数据库连接、内存缓存连接等。
对于 MRI,我会使用分叉,对于 jruby,有更多用于线程的案例
【解决方案2】:
Fork 创建另一个进程,并且进程通常被设计为独立于您的应用程序中发生的任何其他事情运行。进程不共享资源。
但是,线程是为不同的目的而设计的。如果您希望并行化某个任务,则可能需要使用线程。
“fork() 导致两个进程之间的父子关系。线程创建导致进程的所有线程之间的对等关系。”
阅读更多关于this link的解释。