問題タブ [goroutine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - このプログラムで競合状態が発生するのはなぜですか?
Golang のドキュメントで典型的なデータ競合を見ていますが、このプログラムに問題がある理由がよくわかりません。
印刷5, 5, 5, 5, 5
すると予想されるときに印刷されます0, 1, 2, 3, 4
(必ずしもこの順序であるとは限りません)。
私の見方では、ゴルーチンがループ内で作成されると、 の値i
がわかっています (たとえば、log.Println(i)
ループの先頭で a を実行して、期待値を確認できます)。したがって、ゴルーチンi
が作成時の値を取得し、後でそれを使用することを期待しています。
明らかにそれは何が起こっているのかではありませんが、なぜですか?
multithreading - 値を待たずにチャネルから値を取得する方法
Go では、チャネルから受信しようとすると、チャネルに何らかの値が入るまでプログラムの実行が停止します。ただし、私がやりたいことは、プログラムの実行を継続させ、チャネルに値がある場合はそれに基づいて行動することです。
私が考えている疑似コードは次のようなものです。
私が理解しているようにv <- mychan
、値が利用可能になるまでプログラムの実行がブロックされるため、単純に使用することはできません。Goでこれを行う方法は何でしょうか?
go - 奇妙なゴルーチンの振る舞い
間違っている場合は修正してください。私の知る限り、ゴルーチンはスレッドとほぼ同じように機能します。したがって、go の前に異なるパラメーターを付けて同じ関数を生成するとします。それは完全にうまくいくはずですか?
実際の出力:
私はただプロンプトを返します。
期待される出力:
必ずしも同じ順序ではありません。
この奇妙な行動を理解することができません。何か不足していますか?
編集: Scan ステートメントを追加すると解決します。しかし、それを行うより良い方法はありますか?
go - Go chanで値がバッファリングされているかどうかを確認する方法はありますか?
どうすれば次のようなことができますか?:
基本的に、チャンにバッファリングされた値があるかどうかを確認して、ない場合は、スレッドがブロックされる前に更新メッセージを送信できるようにします。
go - スタックのどこからでも (内部から) ゴルーチンを終了するにはどうすればよいですか?
例えば:
orからゴルーチンを直接終了するにはどうすればよいですfoo()
かbar()
? panic
とを使用することを考えてrecover
いましたが、それらがどのように機能するか正確にはわかりません。goroutine()
(従来の例外処理では、の本体をブロックでラップし、try
終了するときに例外をスローします。)
編集:私が使用した場合panic
、私はする必要がありrecover()
ますか?
go - ゴルーチンを使用する正しい方法は何ですか?
各リクエストにいくつかのテストを適用し、テストの結果に基づいて応答を開始する必要があります。テストの 1 つが失敗した場合は、すぐに応答を送信する必要があります。それ以外の場合は、すべてのテストが正常に完了するまで待ちます。そのテストを並行して行いたい。
今、私は次のようにします(簡略化):
ゴルーチンの例:
問題は、シグナルを終了した後、ゴルーチンがメモリを解放しないことです。やったシャネルに何かがあるからそうなったのだと思います。私はGOでまったく新しいので、間違った方法で使用している可能性がありますか?
たとえば、 load check を開始するhttp_load -parallel 10 -seconds 10
と、ゴルーチンは簡単に 100 MB 以上の RAM を消費し、システムに戻さなくなります。次のチェックでは、さらに 100 MB 以上を消費します。
そのテストをgo
(段階的に)実行しない場合、プログラムは負荷チェックで10〜15MBしかかかりません。
go - ゴルーチンがプログラムを壊した
問題はこれです: Web サーバーがあります。ページの読み込みにゴルーチンを使用すると有益であると考えたので、goroutine として loadPage 関数を呼び出すことにしました。ただし、これを行うと、サーバーはエラーなしで動作を停止します。空白の白いページが印刷されます。問題は関数自体にあるに違いありません - 何かがゴルーチンと競合しています。
関連する機能は次のとおりです。
multithreading - Goゴルーチンはコルーチンですか?
Google I/O 2012 プレゼンテーションGo Concurrency Patternsで、Rob Pike は複数のゴルーチンが 1 つのスレッドに存在できると述べています。これは、それらがコルーチンとして実装されていることを意味しますか? そうでない場合、それらはどのように実装されていますか? ソースコードへのリンクは大歓迎です。