在后台进程中分叉和线程有什么区别?

时间:2012-05-19 16:31:59

标签: ruby-on-rails ruby background-process

阅读它所声明的spawn gem的文档:

  

默认情况下,spawn将使用fork来生成子进程。您可以   通过告诉spawn方法何时将其配置为进行线程化   你打电话或配置你的环境。例如,这是   如何告诉spawn在通话中使用线程,

使用fork或thread之间的区别是什么,这两个决定的影响是什么,以及我如何知道使用哪个?

2 个答案:

答案 0 :(得分:4)

线程意味着您在同一进程中的另一个线程中运行代码,而分叉意味着您分叉一个单独的进程。

一般来说,线程意味着你将使用更少的内存,因为你没有一个单独的应用程序实例(如果你有一个写友好的ruby副本,比如ree,这个优势就会减少)。线程之间的通信也更容易一些。

根据您的ruby解释器,ruby可能无法有效使用额外的核心(jruby擅长这一点,MRI更糟糕)因此产生一堆额外的线程将影响您的Web应用程序的性能,并且不会充分利用您的资源 - MRI一次只运行一个线程

Forking会创建单独的ruby实例,以便您更好地利用多个内核。您也不太可能对主要应用程序产生负面影响。在fork时共享打开文件描述符时需要小心谨慎,因此通常需要重新打开数据库连接,memcache连接等。

使用MRI我会使用分叉,jruby有更多的情况需要进行穿线

答案 1 :(得分:3)

Fork创建了另一个进程,进程通常设计为独立于应用程序中发生的任何其他进程运行。进程不共享资源。

然而,线程是为不同目的而设计的。如果您希望并行化某个任务,则可能需要使用线程。

“fork()在两个进程之间引发父子关系。线程创建会在进程的所有线程之间产生对等关系。”

阅读this link上更详尽的解释。