コルーチンに使用される通信チャンネル

チャンネル:(間の通信の調整を担当する処理)データを送信するために使用されるパイプのタイプ
FIFOチャネル。

ステートメント:
VAR識別子チャンデータ型
はnilチャネルの初期値は、
すべてのタイプのエアインタフェースチャネルのに使用することができます。
参照型のチャネル。我々はまた、それにメモリクラスを割り当てるためにメイク()関数を使用します。

VaRのCH1ちゃん列
CH1 =メイク(ちゃん文字列)
CH1:=作る(ちゃんの文字列)

通信事業者:
< -
流路
CH < - INT1
流出
NUM:= < - CH
< - CH

デッドロック:
1.runtimeメインコルーチンチェックそのチャネル(バッファリングされていない)主コルーチン他端が使用されていない場合、デッドロックが報告される
2バッファ:いくつかのデータの書き込みが、別のセグメントがあるためフルチャネルが書き込みを続けることができないときは、デッドロック。
2.mainコルーチンAコルーチンデッドロックが生じ、それにコルーチンのメインコルーチン送信データを待っている間、それにデータを送信するのを待ちます。
デッドロックに加え2.メインコルーチンのコルーチンの外部との間避けることができない、独自のチェックが必要です。

妨害:
状況がブロックされているチャンネルにデータを読み書きすることはできません。
書き込みの場合:バッファなし:受信側の準備ができていない
バッファ:チャンネルのフルタイム
バッファなし::送信者の準備ができていない状況の読み取り
バッファ:空白チャンネル
:バッファリングされたチャネル使用
BUFを:100 =
CH1では:メイク(チャン文字列、BUF)=
よりスケーラブル:チャネル・バッファを使用します。

セマフォモード:
別のコルーチンにコルーチンの書き込みデータは、(このデータは別のコルーチンコルーチンを待っている)の実行の終わりを示す
FUNC A(A_B、B_aチャンはint){
{のために
- B_a <
"fmt.Println( A「)
A_B <-1
}

}
{FUNCのB(A_B、B_AちゃんINT)
{用
<-A_B
fmt.Println( "B")
B_A <-1
}

}

匿名関数(コルーチン)チャネルを備えた
移動FUNC(){
Cha_B <-1
}()
セマフォを達成バッファチャネルリソースを用いて
チャネル容量の同じ総数とリソース1の数
2内側要素の長さと、現在使用されるチャネルリソースを同じ番号
3チャネル容量マイナスチャネル要素未使用の長さに等しい要素の総数
P、Vの動作
占有されているどのように多くのリソースを示すために通路内に複数の要素を書き込むP動作
通路を示すために、書き込み操作複数のVエレメントをどのように多くの要素が解放され
(、バッファ別個のチャネルロックラッチを設定することをお勧め(1))のロックラッチを
ロック、充填要素をチャネルに、チャネルは、他の共ルーチンはロックがブロックされる使用、充填されています。
他のプロセスが彼らの協力のロックを継続できるよう、リリース通路に、すべての要素のロックを解除します。
読み書きチャネル要素はアトミック操作です。


{FUNC P(N INT)
:=新しい(empty.Empty)E
iについて:= 0; iがN <; I ++ {
CH1 < - * E
}
}
FUNCのV(N INT){
iについて:= 0; iが< nは、I ++ {
<-CH1
}
}
FUNC待ち(N INT){
P(N)
}
Siganl(N INT){FUNC
V(N)
}

chLock:=作る(チャンINT、1)
FUNCのP(){chLock <-1}
FUNCのV(){< - chLcok}
FUNCロック(){
P(1)
}
FUNCロック解除(){
V(1)
}

ループのためのチャネル
V用:範囲はCH = {
...............
}
(反復)の通常
Iの場合:= 0;私は()c.len <; I ++ {
CH < - c.items [I]
}

一般チャネル)が一定の方向に応じて送信されてもよいように、チャネル:(コルーチンパラメータの方向で使用される
ロック(それはチャネルのいずれかで書き込み読み取ることができる機能コルーチンに表示されるように、ほとんどの場合において)特殊なケースである
私達のチャネルが2つのチャネルコルーチン間の伝送を向けられています。
VAR send_onlyちゃん< - INT(送信のみ)
VAR recv_only < -チャンint型(それが役に立たないシャットダウン機能であるため、受信専用、受信専用チャンネルが、閉じることができません)

チャネルが閉じられる:(また、値を受け取ることができる)
(CH)閉じる通路<によってマークされたように、実際にはない-受信値。
(閉鎖されており、第二通路がパニックにつながるチャネルにデータを書き込む)
チャネルが閉じているかどうかをテストするために
OK、V:= < - CH ( 第2の戻り値が正常読み取られる読み取り、既に読み取らいくつかの要素がtrueを返したが、チャネルがクローズされ、あなたが読むことを続けることができ、すべての要素を読み終え、その後、パニックが発生していない、ゼロ値と虚偽を読む)
チャネルがクローズされると(偽外観を表現することができますA。)

SELECT使用ノンブロッキングチャネル(閉じることができない)読み取り、
SELECT {
-のCH1 = <:ケースU
...
ケースV:= < - CH2:
...
...
デフォルト:// READYにNO値をBE受信
...
}
。1(デフォルト)は、待機していない場合>ブロックされ
、ランダムに複数から選択した場合2>処理することができる
3>デフォルト実行、処理できません
{)(FUNCメインを
のCH1:メイク=(INTチャン)
CH2:メイク(チャンはint)=
CH3を:メイク(チャンINT)=
ゴーFUNCを(){
{ため
time.sleep(1000)
のCH1 < - 1
CH2 < - 2
。CH3 < - 3
}

}()
{ため
time.Sleep(100)
を選択し、{
ケースNUM:= <-CH1:
fmt.Println(NUM)
場合NUM:= < - CH2:
fmt.Println(NUM)
場合NUM:= < - CH3:
FMT .Println(NUM)
デフォルト:
fmt.Println( "なしnimber")
}
}

チャネル、タイムアウト、タイマ
時間パケット:
指定された時間間隔値におけるtime.Ticker構造は、繰り返しチャネルC(内部フィールド)に送信されます。
コルーチンとリカバリ(復旧)
独立したパニックや他のコルーチンコルーチンで発生します。すべての処理はこれだけコルーチンであります

使用ロック(sunc.lock)シナリオ:
1>の共有データキャッシュ情報構造にアクセスするための
2>データ参照するコンテキスト状態情報を保存する
チャネルシナリオ使用:
1>非同期動作の結果と相互作用する
2>を配信タスク
3>データ転送の所有権

おすすめ

転載: www.cnblogs.com/mcmx/p/11390899.html