Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyのファイバーについて誰もが知っておくべきこと

Rubyプロジェクトから最大限のパフォーマンスを引き出したい場合は、ファイバーとその機能を調査する必要があります。

簡単な質問から始めましょう…

繊維とは何ですか?

ファイバーはワーカーであり、コードを実行し、自分の進捗状況を追跡します。言い換えれば、ファイバーは並行性のメカニズムです。

はい!

スレッドのように。スレッドよりもファイバーをより細かく制御できるという違いがあります。

どのような意味であなたはより多くのコントロールを持っていますか?

ええと。

オペレーティングシステムが、スレッドを実行するタイミングと一時停止するタイミングを決定します。

ファイバーの場合はそうではありません!

実行するタイミングと停止するタイミングをファイバーに正確に伝える必要があります。

ファイバーとスレッド

スレッドはバックグラウンドで実行されているように感じ、自分のことを実行しています。

ファイバーはこれを行いません。

ファイバーの実行中は、停止するまでメインプログラムになります。

コード例を見てみましょう!

ファイバーの使用:例

Fiber.newを使用してファイバーを作成します &ブロック。

f = Fiber.new { puts 1 }

次に、resumeを使用してファイバーを実行します メソッド。

このように

f.resume

これは1を出力します &それはあなたのメインプログラムに制御を戻します。

しかし、どのようにしてファイバーを止めますか?

Fiber.yieldを使用 yieldとは異なるメソッド ブロックに使用されるキーワード。

f = Fiber.new { puts 1; Fiber.yield; puts 2 }

f.resume
# 1

f.resume
# 2

これにより、1が出力されます resumeでファイバーを開始した後 、その後停止します。

resumeを呼び出す場合 もう一度…

残したところから正確に続行し、2を印刷します 。

:このファイバーをもう一度再開すると、FiberError: dead fiber called 実行するコードがこれ以上ないためです。

これが繊維が役立つ理由です!

Fiber.yieldを呼び出す ファイバーの内部は、一時停止ボタンを押すようなものです。ループの途中、またはファイバーのブロック内に記述したコードで停止できるようにします。

ファイバーとループ:エンドレスシーケンス

この「一時停止ボタン」効果を使用して、無限のシーケンスを作成できます。

材料

  • 繊維
  • ループ
  • カウンター

たとえば、階乗数

factorial =
Fiber.new do
  count = 1

  loop do
    Fiber.yield (1..count).inject(:*)
    count += 1
  end
end

resumeを使用すると、このファイバーを何度でも使用できます。 メソッド、シーケンス内の次の番号を取得します。

Array.new(5) { factorial.resume }

# [1, 2, 6, 24, 120]

いいね!

ファイバーとIO:非同期操作

ファイバーは、ネットワーク接続など、待たなければならないことに関して、スレッドよりも高速で効率的です。

なぜですか?

ファイバーを使用するとコンテキストスイッチが少なくなるためです。

コンテキストスイッチは、CPUが現在のタスクから別のタスクに変わるときです。

これには少額の費用がかかりますが、合計されます!

Linuxのperfツールを使用していくつかのテストを行ったところ、単純なRubyアプリケーションでは、ファイバーが生成するコンテキストスイッチがスレッドの3分の1であることがわかりました。

いいですね

今すぐファイバーの使用を開始できます

  • IO.selectを使用 メソッド+Reactorデザインパターン
  • 非同期gemを使用
  • ファルコンアプリケーションサーバーを使用

覚えておいてください…

特効薬はありませんが、テストして、ファイバーがあなたのために何ができるかを確認する価値があります🙂

概要

Rubyのファイバーについて学びました!ファイバーを使用すると、自分の意志で一時停止および再開できるコードの単位を作成できます。 。

今度はこれを試してみる番です。

読んでくれてありがとう!


  1. Facebookはあなたについて何を知っていますか? Facebookを削除する理由

    Facebookには世界中で26億人のアクティブな月間ユーザーがいて、私たちについて驚くべき量を知っています---私たちが喜んでボランティアする情報。 名前、年齢、学歴などの基本的な詳細だけではありません。非常に個人的なものもあり、Facebookのプライバシーポリシーを確認したくなるでしょう。ソーシャルネットワークはビジネスです。では、この特定のビジネスはあなたについて何を知っていますか? Facebookのプライバシー設定を変更するにはどうすればよいですか? Facebookはあなたに関する基本情報を知っています あなたの個人的な生活とオンラインの生活の間の境界線はすぐに曖昧になりま

  2. Ruby定数について知っておくべきことすべて

    Rubyの定数とは何ですか? 定数は、常に大文字で始まる変数の一種です。それらは外部でのみ定義できます メタプログラミングを使用しない限り、メソッドの数。 定数は変更されるべきではない値に使用されますが、Rubyはそれらの変更を妨げません。 このように見えます : FRUIT = orange 今 : 定数は重要なトピックであるため、この記事で詳細に説明します。 定数の定義方法 定数は、宣言するために特別な記号や構文を必要としません。最初の文字を大文字にする必要があります。 以下は有効な定数です : ABC = 1 Goo = 2 Foo = 3 メソッド内で定数を定義