0{"/> 0{">

ホームページ  >  記事  >  バックエンド開発  >  致命的なエラー: すべてのゴルーチンがスリープ状態です - デッドロック!エラー実行

致命的なエラー: すべてのゴルーチンがスリープ状態です - デッドロック!エラー実行

王林
王林転載
2024-02-10 16:42:19999ブラウズ

致命错误:所有 goroutine 都在睡觉 - 死锁!错误执行

#php エディター Strawberry は、この記事で一般的なプログラミング エラーを紹介します: 致命的なエラー: 「すべての goroutines がスリープしています - デッドロック! エラー実行」。これは Go 言語でよくある間違いの 1 つであり、開発者がよく遭遇する課題の 1 つです。この記事では、誰もがこの問題をよりよく理解して対処できるように、このエラーの原因と解決策を詳しく説明します。初心者でも経験豊富な開発者でも、この記事から貴重な情報とヒントを得ることができます。一緒に探検しましょう!

質問内容

Go の同時実行については非常に初心者なので、チャネルとゴルーチンを使用した例を試してみました。生産者・消費者モデルが必要です。プロデューサー関数は常にランダムな文字列を与え、コンシューマーはそれらを大文字にすることで変更します。限られた時間(2秒)だけ実行したい。

リーリー

配列要素が 1 つだけ発生し、いくつかのエラーが発生しました。この例を機能させるにはどのような変更を加える必要がありますか?

出力:

###二###

致命的エラー: すべてのゴルーチンがスリープ状態です - デッドロック!

ゴルーチン 1 [受信者]: main.main()

コルーチン 6 [送信者]: main.Producer({0xc00004e040, 0x4, 0x0?}, 0x0?) メインが作成しました。主要 終了ステータス 2

解決策

コンシューマはループ内で実行する必要があります。これについてはすでに述べました。

consumer の最初のパラメータを文字列ではなく

chan string

になるように変更します。このようにして、プロデューサーは、制限時間が経過するまで、コンシューマーが別のチャンネルで公開できるように、このチャンネルに書き込みを続けることができます。 リーリー ここで、

go Consumer()

を呼び出す前の main 関数で、c1 チャネル上のプロデューサーからの最初の応答を待っています。これを行わず、代わりに c1 チャネルを最初の引数として渡します。 リーリー これは、プロデューサーが

c1

チャネルに乱数を継続的に書き込み、コンシューマーが 2 秒が経過するまで d1 チャネルにすべての大文字のテキストを継続的に書き込み続けることを示しています。

以上が致命的なエラー: すべてのゴルーチンがスリープ状態です - デッドロック!エラー実行の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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