叙情的な余談
たとえば、サーバーを作成しています。 サーバーの化身は、常に何かをポーリングするループです。 小さい離散的なものはすべて一定であると見なされるため、一定の接続が得られます。
現実
ルビーには無限ループがあります。
Copy Source | Copy HTML loop { puts " ." } # . puts " , ."
つまり ループを開始する前にすべてを行う必要があります。
さらに、この操作はプロセッサに非常に敏感です。 あまり頻繁に繰り返す必要がない場合は、サイクルをしばらくスリープ状態にすることができます。
Copy Source | Copy HTML
- ループ {
- 「何も私を止めることはありません。」
- sleep ( 1 ) #スリープの1秒
- }
また、異なる周波数で操作を実行する必要がある場合、1サイクル以内に問題が発生します。
スレッド
これらの問題を解決するために、スレッドがあります。
典型的なストリーム
Copy Source | Copy HTML
- スレッド .new {
- ループ {
- 「私はスレッドだ」と言う
- }
- }
初めての体験
ここで、どのようにThreadの調査を開始したか、そして私が驚いたことを示します。
スレッドを使用した最初のプログラムは、上で書いたように見えました。 私がそれを起動したとき、何も起こりませんでした。 私の頭に浮かんだ(そして誤った)最初の考えは、
結合を使用して判明
説明を読まずに、
Copy Source | Copy HTML
- thr_1 = スレッド .new {
- ループ {
- 寝る ( 5 )
- 「5」を 置きます
- }
- }
- thr_2 = スレッド .new {
- ループ {
- 睡眠 ( 10 )
- 「TEN」を 置きます
- }
- }
- thr_3 = スレッド .new {
- ループ {
- 睡眠 ( 1 )
- 「ダニ」を 置く
- }
- }
つまり ループ内の操作が異なる周波数で実行されるプログラム(上記)であり、文字通り、誤ってthr_1.join(たとえば)が自分自身だけでなくすべてのスレッドを「開始」することを発見しました。
そして、フローを永遠のループではなくメソッドに書き込もうとすると、さらに奇妙になりました。 それらは、満たされるか、部分的に満たされるか、またはまったく満たされない可能性があります。 雲が集まっていましたが、テストプログラムの丘を通り抜けて真実に到達しました。
参加は始まりではありません!
アプリケーションを起動するとすぐに、Thread.mainに入ります。
その中のすべての操作が終了すると、アプリケーションは閉じます。 他のスレッドがある場合、アプリケーションはそれらに関係なく閉じます。
たとえば、スレッドの作成に加えて何もすることがない場合、プログラムは作成されたスレッドでコードを実行せずにすぐに終了します-最初に私に起こったこと。
joinは、呼び出し元のスレッドが完了するまで、呼び出し元のスレッドをスリープ状態にします。
つまり 最初は、thr_1が完了するまでThread.mainをスリープ状態にしました。 Thread.mainは非アクティブになりましたが、thr_1スレッドが完了するのを待って終了しなかったため、アプリケーションも終了せず、他のスレッドは喜んで機能し続けました。
sleepコマンドでスレッドを実行してください!
Thread.mainを拡張する最も簡単な方法は、それをスリープ状態にすることです。
Copy Source | Copy HTML
- スレッド .new {
- 「最後に」 置く
- }
- スレッド .new {
- 「やるぞ!」
- }
- スリープ 5 #しばらくスリープ状態にする
- スリープ #または永遠に
走る
睡眠スレッド Thread.main、runメソッドを使用して再度実行できます
そして、sleepまたはThread.stopメソッドで停止します。
Copy Source | Copy HTML
- thr = Thread .new {
- スリープ #z z Z
- 「..寝ていない..」
- 「そしてあなたは眠らない」と言う
- スレッド .main.run
- }
- スレッド .new {
- 寝る 1
- 「ウェイクアップ!」
- thr.run
- }
- スレッド .stop
スレッドを使用した今日のすべて。 これは私の最初の記事です(一般的に)。 私はレビューを聞いて、おそらく、私は物語を続けます:)