それが述べているスポーンジェムのドキュメントを読む:
デフォルトでは、spawnはフォークを使用して子プロセスを生成します。呼び出し時にspawnメソッドに指示するか、環境を構成することにより、スレッド化を実行するように構成できます。たとえば、これは、呼び出しでスレッドを使用するようにspawnに指示する方法です。
フォークとスレッドの使用の違いは何ですか、どちらの決定の影響は何ですか、そしてどちらを使用するかをどのように知ることができますか?
それが述べているスポーンジェムのドキュメントを読む:
デフォルトでは、spawnはフォークを使用して子プロセスを生成します。呼び出し時にspawnメソッドに指示するか、環境を構成することにより、スレッド化を実行するように構成できます。たとえば、これは、呼び出しでスレッドを使用するようにspawnに指示する方法です。
フォークとスレッドの使用の違いは何ですか、どちらの決定の影響は何ですか、そしてどちらを使用するかをどのように知ることができますか?
スレッド化とは、同じプロセスの別のスレッドでコードを実行することを意味しますが、フォークとは、別のプロセスをフォークすることを意味します。
一般に、スレッド化とは、個別のアプリケーションインスタンスがないため、使用するメモリが少なくなることを意味します(reeなどの書き込みに適したrubyにコピーがある場合、この利点は少なくなります)。スレッド間の通信も少し簡単です。
ルビーインタープリターによっては、ルビーが余分なコアを効率的に使用しない場合があります(jrubyはこれが得意ですが、MRIははるかに悪いです)。そのため、余分なスレッドを大量に生成すると、Webアプリのパフォーマンスに影響し、リソースを十分に活用できなくなります。 MRIは一度に1つのスレッドのみを実行します
フォークすると個別のrubyインスタンスが作成されるため、複数のコアをより有効に活用できます。また、メインアプリケーションに悪影響を与える可能性も低くなります。フォークするときに開いているファイル記述子を共有するため、フォークするときは少し注意する必要があります。そのため、通常はデータベース接続、memcache接続などを再度開きます。
MRIではフォークを使用しますが、jrubyではスレッド化のために作成するケースが多くなります
Forkは別のプロセスを作成し、プロセスは通常、アプリケーションで行われている他のプロセスとは独立して実行されるように設計されています。プロセスはリソースを共有しません。
ただし、スレッドは別の目的のために設計されています。特定のタスクを並列化する場合は、スレッドを使用することをお勧めします。
「fork()は、2つのプロセス間に親子関係を誘導します。スレッドの作成は、プロセスのすべてのスレッド間にピア関係を誘導します。」
このリンクのより詳細な説明を読んでください。