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

阅读它所述的spawn gem的文档:

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

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

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

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

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

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

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

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

但是,线程是为不同目的而设计的。 如果要并行化某个任务,则需要使用线程。

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

阅读此链接的更广泛说明。