13

プログラムの速度を上げようとしていますが、Rubyファイバーはスレッドよりも高速で、複数のコアを利用できると言われています。周りを見回しましたが、実際に異なるファイバーを同時に実行する方法がわかりません。スレッドを使用すると、これを行うことができます。

threads = []

threads << Thread.new {Do something}
threads << Thread.new {Do something}

threads.each {|thread| thread.join}

繊維を使ってこのようなことをする方法がわかりません。私が見つけることができるのは、ファイバー間の開始yieldresume停止の束のように見えることだけです。ファイバーで真の並行性を実現する方法はありますか?

4

3 に答える 3

15

いいえ、sとの同時実行はできませんFiberFibersは単に同時実行構造ではなく、Exceptionsのような制御フロー構造です。それがsの要点です。それらは並行して実行されることはなく、協調的であり、決定論的です。sはコルーチンです。(実際、なぜそれらが単にsと呼ばれないのか理解できませんでした。)FiberFiberCoroutine

Rubyの唯一の並行性構造はですThread

于 2010-06-18T00:07:20.870 に答える
14

並行性と並列性の間には用語の問題があるようです。

実際に異なるファイバーを同時に実行する方法がわかりません。

私はあなたが実際に並行性についてではなく、並列性について話していると思います:

並行性とは、2つのタスクが重複する期間に開始、実行、および完了することができる場合です。必ずしも両方が同時に実行されることを意味するわけではありません。例えば。シングルコアマシンでのマルチタスク。並列処理とは、タスクが文字通り同時に実行される場合です。マルチコアプロセッサ上

引用:並行性と並列性-違いは何ですか?

ここにもよく示されています:http: //concur.rspace.googlecode.com/hg/talk/concur.html#title-slide

だから質問に答えるために:

ファイバーは、Rubyで軽量の協調的並行性を実装するためのプリミティブです。

http://www.ruby-doc.org/core-2.1.1/Fiber.html

これは、並行して実行できるという意味ではありません。

于 2014-05-15T15:16:39.007 に答える
1

真の同時実行性が必要な場合は、jrubyでスレッドを使用する必要があります(実際にはファイバーがなく、ファイバーごとに1つのスレッドしかありません)。

もう1つのオプションは、新しいプロセスに「フォーク」することです。これにより、MRIで真の並列処理を実行できます。

于 2010-06-19T20:27:55.193 に答える