2017-11-23 23 views
0

このような状況を考慮してください。 1つのメインgoroutineと10個の補助 のゴルーチンがあります。すべてのユーザーはchannelにアクセスできます。メインチャンネルは1000の番号をこのチャンネルに送信し、子機の番号はこのチャンネルから読み取ります。 各従属ゴルーチンが100個の数字を正確に読み取ることが保証されているか、またはこの金額はいくつかのゴルーチンが99個の数字と101個の数字を読み取るように変わることがありますか?チャネル経由の通信

+0

保証はありません。そのような保証はなぜ必要ですか? – tkausl

+0

@ tkauslはゴルーチン間でタスクを均等に配布します –

+2

このような保証はないだけでなく、通常の状況下で起こると想定する理由もありません。 – Flimzy

答えて

2

いいえ、すべてのゴルーチンのランタイムに依存し、ゴルーチンがCPUにどれだけうまく分散されているかによって異なります。

+0

興味深いところですが、GoRoutinesのスケジュール方法に関するブログ記事[here](https://rakyll.org/scheduler/)が見つかりました。 –

1

バッファされていないチャネルを介したゴルーチンのスケジューリングでは、チャネルは純粋にブロックメカニズムとして機能します。つまり、値は決して「チャネルに送信される」ということではありません。

バッファリングされていないチャンネルは純粋に同期メカニズムとして機能します。チャネル上で送信するゴルーチンの場合、 "ゴルーチンが受信できるようになるまでスリープ"し、受信するゴルーチンの場合は "ゴルーチン送信準備ができています "。

これは、送信と受信にフェアネスまたは配信システムが組み込まれていないことを明確にする必要があります。純粋に先着順であり、スケジューラの現在の負荷によってはさらに恣意的です。

+0

CSPの考え方では、この区別は不要であり、あなたの説明は事柄を明確にするのに役立たない。バッファされていないチャネルは、データイベントが流れる「通常の」チャネルです。バッファされたチャネルには拡張された動作があります。 –

+0

これは概念的に正しいものを置く方法だと確信していますが、「データイベントの流れ」という言葉はパイプやキューを私の心に持っています。つまり、データイベントは相手の状態に関係なく受け入れられます。 。しかし、これは、バッファ内のチャンネルがGoでどのように動作するかではありません。 –

関連する問題