ホームページ  >  記事  >  バックエンド開発  >  Goroutine が途中でスリープしてしまう

Goroutine が途中でスリープしてしまう

PHPz
PHPz転載
2024-02-09 11:30:311136ブラウズ

Goroutine 过早进入睡眠状态

php エディター Banana は、ここでよくある問題、つまり Goroutine が途中でスリープしてしまう問題を紹介します。 Go 言語で Goroutine を使用してタスクを同時に実行するのは非常に効率的ですが、タスクを実行する前に Goroutine がスリープ状態に入り、タスクが正常に進行しない状況に遭遇することがあります。この記事では、この問題の原因を詳細に説明し、誰もが Goroutine をよりよく理解して使用できるようにするための解決策を提供します。

質問内容

コード:

リーリー

このコードは特別なことを何も行っていません。チャネルとゴルーチンを理解したいだけです。しかし、何か問題が発生し、コルーチンが 2 回ループした後にスリープ状態になり、アプリがクラッシュしました。

これが何をするのか分析してみましょう - メッセージは毎秒 link に送信されます。関数 b はそれを 2 か所で受け取るため、print a と b が呼び出されます。したがって、基本的には 1 秒ごとに a と b がコンソールに表示されるはずです。しかし、理由はわかりませんが、それは起こりません。プログラムは a と b を 1 回出力してからクラッシュします。 私はおそらくこの概念を十分に理解していないので (golang は実際には直観的ではありません)、ここで答えが得られることを願っています。

解決策

バッファリングされていないチャネルへの送信は、そこからデータを受信するゴルーチンがある場合にのみ成功します。最初の 2 つの送信では、link チャネルから受信するゴルーチンがあります。しかし、それらは値を受け取って終了し、link から受け取るゴルーチンはもうないので、3 番目のブロックは link に送信されます。他に実行中のゴルーチンがないため、プログラムはデッドロックします。

以上がGoroutine が途中でスリープしてしまうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。