Ruby紹介スレッド

叙情的な余談



たとえば、サーバーを作成しています。 サーバーの化身は、常に何かをポーリングするループです。 小さい離散的なものはすべて一定であると見なされるため、一定の接続が得られます。

現実



ルビーには無限ループがあります。

Copy Source | Copy HTML loop { puts " ." } # . puts " , ."



  1. Copy Source | Copy HTML loop { puts " ." } # . puts " , ."



  2. Copy Source | Copy HTML loop { puts " ." } # . puts " , ."



  3. Copy Source | Copy HTML loop { puts " ." } # . puts " , ."



  4. Copy Source | Copy HTML loop { puts " ." } # . puts " , ."



  5. Copy Source | Copy HTML loop { puts " ." } # . puts " , ."





つまり ループを開始する前にすべてを行う必要があります。

さらに、この操作はプロセッサに非常に敏感です。 あまり頻繁に繰り返す必要がない場合は、サイクルをしばらくスリープ状態にすることができます。

Copy Source | Copy HTML



  1. ループ {
  2. 「何も私を止めることはありません。」
  3. sleep1#スリープの1秒
  4. }


また、異なる周波数で操作を実行する必要がある場合、1サイクル以内に問題が発生します。

スレッド



これらの問題を解決するために、スレッドがあります。

典型的なストリーム

Copy Source | Copy HTML



  1. スレッド .new {
  2. ループ {
  3. 「私はスレッドだ」と言う
  4. }
  5. }


初めての体験



ここで、どのようにThreadの調査を開始したか、そして私が驚いたことを示します。

スレッドを使用した最初のプログラムは、上で書いたように見えました。 私がそれを起動したとき、何も起こりませんでした。 私の頭に浮かんだ(そして誤った)最初の考えは、 スレッドを開始する必要があるということでした。そして、「開始」メソッドを探してドックに登りました。

結合を使用して判明

説明を読まずに、 これがスレッドの開始方法であると判断しました。 さらに、私自身の娯楽のために、私は時計を作りました:

Copy Source | Copy HTML



  1. thr_1 = スレッド .new {
  2. ループ {
  3. 寝る5
  4. 「5」を 置きます
  5. }
  6. }
  7. thr_2 = スレッド .new {
  8. ループ {
  9. 睡眠10
  10. 「TEN」を 置きます
  11. }
  12. }
  13. thr_3 = スレッド .new {
  14. ループ {
  15. 睡眠1
  16. 「ダニ」を 置く
  17. }
  18. }


つまり ループ内の操作が異なる周波数で実行されるプログラム(上記)であり、文字通り、誤ってthr_1.join(たとえば)が自分自身だけでなくすべてのスレッドを「開始」することを発見しました。

そして、フローを永遠のループではなくメソッドに書き込もうとすると、さらに奇妙になりました。 それらは、満たされるか、部分的に満たされるか、またはまったく満たされない可能性があります。 雲が集まっていましたが、テストプログラムの丘を通り抜けて真実に到達しました。

参加は始まりではありません!



アプリケーションを起動するとすぐに、Thread.mainに入ります。

その中のすべての操作が終了すると、アプリケーションは閉じます。 他のスレッドがある場合、アプリケーションはそれらに関係なく閉じます。

たとえば、スレッドの作成に加えて何もすることがない場合、プログラムは作成されたスレッドでコードを実行せずにすぐに終了します-最初に私に起こったこと。

joinは、呼び出し元のスレッドが完了するまで、呼び出し元のスレッドをスリープ状態にします。

つまり 最初は、thr_1が完了するまでThread.mainをスリープ状態にしました。 Thread.mainは非アクティブになりましたが、thr_1スレッドが完了するのを待って終了しなかったため、アプリケーションも終了せず、他のスレッドは喜んで機能し続けました。

sleepコマンドでスレッドを実行してください!



Thread.mainを拡張する最も簡単な方法は、それをスリープ状態にすることです。

Copy Source | Copy HTML



  1. スレッド .new {
  2. 「最後に」 置く
  3. }
  4. スレッド .new {
  5. 「やるぞ!」
  6. }
  7. スリープ 5 #しばらくスリープ状態にする
  8. スリープ #または永遠に


走る



睡眠スレッド Thread.main、runメソッドを使用して再度実行できます

そして、sleepまたはThread.stopメソッドで停止します。

Copy Source | Copy HTML



  1. thr = Thread .new {
  2. スリープ #z z Z
  3. 「..寝ていない..」
  4. 「そしてあなたは眠らない」と言う
  5. スレッド .main.run
  6. }
  7. スレッド .new {
  8. 寝る 1
  9. 「ウェイクアップ!」
  10. thr.run
  11. }
  12. スレッド .stop




スレッドを使用した今日のすべて。 これは私の最初の記事です(一般的に)。 私はレビューを聞いて、おそらく、私は物語を続けます:)



All Articles