#修正後は、コンパイルが正しく行われ、エラー メッセージが報告されないことがわかります。
Go の同時プログラミングについて話しましょう (1)也是ok的。
package mainimport (
"fmt"
"time")func createWorker(id int) chan
ログイン後にコピー
学习了这么久了,那么咔咔问你一个问题,这段代码执行会发生什么?
はい、記事の冒頭で述べたように、チャネルにデータを送信するには、別のコルーチンを開いてデータを受信する必要があるため、エラーが発生します。
コルーチンは軽量と言われていますが、データを送信した後、データを受信するためにコルーチンを切り替える必要があり、非常にリソースを消費します。
それでは、このセクションではこれについて説明します。
3 つのバッファを持つことができるチャネルを作成し、3 つのデータをそのチャネルに送信します。
同時に実行した結果から、デッドロック
が発生していないこともわかります。
あなたに質問です。データ 4 をバッファに送信するとどうなりますか?
あなたは賢いです、結果を考えたはずです、はい、報告しましたデッドロック
次に、前のワーカーを使用してチャネル データを受信します。
しかし、実行結果では、送信された 1、2、3、4 が出力されないことがわかります。 。
この質問はこれまでに何度も聞かれていますが、この状況をどのように解決すべきかを自問してみてください。
遅延時間を追加するだけです ちなみに、前の例では文字が出力されたことを説明したいと思います。 、%c はすべての書式設定に使用されますが、数値を出力するようになったので、%d に変更されました。これは小さな変更です。
この方法でチャネルを確立すると、パフォーマンスの向上に一定の効果があります。
これまでに問題を発見しましたか。つまり、チャネルを送信するときに、いつ送信されたかわからないという問題です。
前のコードと矛盾するのは、最後に close を追加したことです。close は送信側でクローズされることに注意してください。
1、2、3、4 は受信されていますが、実行結果が満足のいくものではないことがわかります。
ただし、以下では多数の 0 が受信されましたが、スクリーンショットにキャプチャされたデータは 1 つだけでした。
送信者がチャネルを閉じても、ワーカーはチャネルが閉じられてもデータを受信します。これは、チャネルが閉じられた後にデータが受信されなくなるという意味ではありません。
しかし、送信者がチャネルを閉じるように設定すると、受信したデータはすべて 0 になります。つまり、ワーカー メソッドによって渡されるパラメータ c chan int の値は 0 になります。
これで、チャネルの型は int になり、0 を受け取ります。次に、文字列型の場合、受信されるのは空の文字列です。
これにはどのくらい時間がかかりますか?それが私たちが設定した 1 ミリ秒の時間です。
このプログラムを変更するように頼まれた場合、何かアイデアはありますか?わからない場合は、このクリックのリズムに合わせて揺れてください。
#関数ワーカーでは、受信に 2 つの値が使用されます。n は渡されるチャネル c です。 ok は、値が存在するかどうかを判断することです。
実行結果が表示され、0 データを受信することはなくなります。
学習への粘り強さ、執筆への粘り強さ、そして共有への粘り強さは、Kaka が設立以来常に堅持してきた信念です。巨大なインターネット上の Kaka の記事が少しでもお役に立てれば幸いです。カカです、また会いましょう。