4

阅读它指出的 spawn gem 的文档:

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

使用 fork 或 thread 有什么区别,任何一个决定的影响是什么,我怎么知道使用哪个?

4

2 回答 2

4

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

一般来说,线程意味着您将使用更少的内存,因为您不会有一个单独的应用程序实例(如果您有一个可写的 ruby​​ 副本,例如 ree,则此优势会减弱)。线程之间的通信也容易一些。

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

分叉创建单独的 ruby​​ 实例,以便您更好地利用多个内核。您也不太可能对您的主应用程序产生不利影响。分叉时需要小心一点,因为您在分叉时共享打开的文件描述符,因此您通常希望重新打开数据库连接、内存缓存连接等。

使用 MRI 我会使用分叉,使用 jruby 有更多用于线程的案例

于 2012-05-19T17:06:57.543 回答
3

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

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

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

在此链接上阅读更广泛的解释。

于 2012-05-19T16:54:38.393 回答