問題タブ [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 - 同時実行のGoroutinesの相互排除
私のコードには、3つの同時ルーチンがあります。私は自分のコードの概要を簡単に説明しようとしていますが、
2つの間のコード(2つのスターマーク間のコード)が実行されている間、制御の流れが他のゴルーチンに移動してはならないことを望んでいます。たとえば、routine1が2つのスター間のイベント(イベントの送信と印刷)を実行している場合、ルーチン2と3をブロックする必要があります(実行のフローがルーチン1からルーチン2または3に渡されないことを意味します)。最後の印刷イベントを完了した後、実行のフローはルーチン2または3に渡される場合があります。誰かが指定することで私を助けてくれますか、どうすればこれを達成できますか?WaitGroupで上記の仕様を実装することは可能ですか?WaitGroupを使用して上記の例を実装する簡単な例を挙げて、誰かに教えてもらえますか。ありがとう。
注意:私は2つの送信オプションと2つの印刷オプションを提供しています。実際、送信と印刷はたくさんあります。
go - 相互に並行する Go ルーチンでのデッドロック エラー
以下のような 3 つの同時実行ルーチンがあります。
この論理コードは、毎回デッドロック状態を引き起こします。実際に実行すると、ルーチン1のprint文(*印の間の文)だけを何度も実行するだけで(私のprint文は1つだけですが)、デッドロックエラーが発生します。コードロジックの何が問題なのか、誰でも教えてもらえますか。ありがとう。
注意。詳細については、コードがhttp://play.golang.org/p/pW6aXryUaKにあり、行番号 290 のみが実行されています。エラーを含まない元のコードは、play.golang.org/p/UL3rj8DJRk にあります。それらにロックとロック解除を追加するだけです。ありがとう。
別のポイントを追加したい: play.golang.org/p/UL3rj8DJRk のコードでは、次のようなさまざまな print ステートメントの出力を見つけることができます。 ]。ただし、3 つの同時実行ルーチンの結果として、print ステートメントが適切に実行されないことがあります (つまり、全体が印刷されないことを意味します。プロセス [番号] がプロセス [番号] で [int] をプロセス [番号] に送信するなど、別の印刷によって挿入されるものがあります)。 ]))。これを管理する方法を教えてくれる人はいますか?
go - Goでの並行ルーチンの印刷の問題
私はこのような3つの同時ルーチンを持っています、
今私が直面している問題は、3つの同時ルーチンの結果として、printステートメントが正しく実行されない場合、全体を印刷しないことを意味する場合があり、別の印刷によって挿入されたものがある場合があります。たとえば、ルーチン1のPrint(値a、値b、値c)は、値a、値b、値gのような出力を提供します。ここで、値gはルーチン2によって挿入されます。誰かが私に提案できますか、どうすれば停止できますか?sync-mutexプロシージャを試しました。ただし、コードが長すぎて、正しい方法でロック解除を実行できない可能性があるため、デッドロックエラーが発生している可能性があります。誰かが私にそれらを簡単な方法で、またはよりリスクの少ないsync-mutex手順で実装する方法を提案できますか?
私のこの問題についての詳細はここで見つけることができます。
concurrency - 同時実行ルーチンの相互実行に関する問題
私のコードには、3つの同時ルーチンがあります。私は自分のコードの概要を簡単に説明しようとしていますが、
2つの間のコード(2つのスターマーク間のコード)が実行されている間、制御のフローは他のgoルーチンに移動してはなりません。たとえば、routine1が2つのスター間のイベント(送信イベントと印刷イベント)を実行している場合、ルーチン2と3をブロックする必要があります(つまり、実行フローはルーチン1からルーチン2または3に渡されません)。最後の印刷イベントが完了した後、実行の流れはルーチン2または3に渡される可能性があります。誰かが指定することで私を助けてくれますか、どうすればこれを達成できますか?WaitGroupで上記の仕様を実装することは可能ですか?WaitGroupを使用して上記の例を実装する簡単な例を挙げて、誰かに教えてもらえますか。ありがとう。
NB:これはこれの繰り返しの質問かもしれません。そのsync-lockメカニズムを使用して試しましたが、コードが大きいためにlock-unlockを適切に設定できず、デッドロック状態が発生している可能性があります(または私の方法でエラーが発生している可能性があります)。誰かが簡単な手順で私を助けてくれるので、私はこれを達成することができます。ここに私のコードの簡単な例を示します。ここでは、2つのプリントを配置し、ミューテックス内にイベントを送信します(ルーチン1の場合)。したがって、ルーチン2はそれを中断できません。どうすればそれが可能か教えてくれませんか。与えられた1つの可能な解決策、 エラーを与えるhttp://play.golang.org/p/-uoQSqBJKS 。
go - ゴルーチンの最大数
何個のゴルーチンを無痛で使用できますか? たとえばウィキペディアによると、Erlang では、パフォーマンスを低下させることなく 2000 万のプロセスを作成できます。
更新:ゴルーチンのパフォーマンスを少し調査したところ、次のような結果が得られました。
- ゴルーチンの寿命は sqrt() を 1000 回 (私にとっては ~45µs ) 計算するよりも長いようです。唯一の制限はメモリです
- ゴルーチンのコストは 4 — 4.5 KB
synchronization - チャンネル同期?
次の 3 つのメソッドを使用して、ある種の入力を解析しているとします。
それらはすべて同じ入力の特定の部分を解析し、それを として返すため[]byte
、次のように使用できます。
この 3 つのプロセスをチャネルを使用して並列化したいと考えています。私のアイデアは、これらの関数にチャネルを渡して書き込みを行うことでしたが、チャネルに正しい順序で書き込むことを確認するにはどうすればよいですか? (つまり、本文はヘッダーの後にチャネルに書き込まれ、本文の後にフッターが書き込まれます)
go - 長時間実行される Go プログラムを実行し続けるにはどうすればよいですか?
私はGoで書かれた長期稼働サーバーを持っています。Main は、プログラムのロジックが実行されるいくつかのゴルーチンを起動します。その後、メインは何も役に立ちません。main が終了すると、プログラムは終了します。プログラムを実行し続けるために私が現在使用している方法は、fmt.Scanln() への単純な呼び出しです。他の人がメインを終了させない方法を知りたいです。以下は基本的な例です。ここで使用できるアイデアやベスト プラクティスは何ですか?
チャネルを作成し、そのチャネルで受信することでメインの終了を遅らせることを検討しましたが、ある時点ですべてのゴルーチンが非アクティブになると問題になる可能性があると思います。
補足: 私のサーバー (例ではありません) では、プログラムは実際にはシェルに接続して実行されていないため、とにかくコンソールとやり取りする意味がありません。今のところはうまくいきますが、「正しい」方法があると仮定して探しています。
go - goroutinechannels-sendステートメントの値
印刷しようとしたとき:
下のコードブロックのforループの直前で、「c <-x」が何に評価されるかを確認すると、エラーメッセージが表示されます。./select.go:7:ステートメントc<-xを値として使用します。非ブロッキング送信にはselectを使用します
送信操作が成功した場合、「c <-x」はtrueと評価されますか?また、Goでは、selectステートメント内のcaseステートメント内でsendステートメントの値(別名「c <-x」の値)のみを使用できるのはなぜですか?
ありがとうございました
concurrency - 標準出力への出力により、ブロックされたゴルーチンが実行されますか?
ばかげた基本的なスレッド化の演習として、私は睡眠中の床屋問題を golang で実装しようとしました。チャネルを使用すると、これは非常に簡単なはずですが、ハイゼンバグに遭遇しました。つまり、診断しようとすると、問題が消えます!
以下を検討してください。このmain()
関数は整数 (または「顧客」) をshop
チャネルにプッシュします。barber()
チャネルを読み取り、shop
「顧客」の髪をカットします。fmt.Print
関数にステートメントを挿入するcustomer()
と、プログラムは期待どおりに実行されます。そうでなければ、barber()
誰の髪も決して切らない。
何が起こっているのか分かりますか?
go - 同時実行中にGoの変数へのアクセスをロック/同期するにはどうすればよいですか?
この質問に対する彼の答えの中で: Golang for Windowsの不安定な動作? ユーザー@distributedは、同時実行のgoroutineで共有変数へのアクセスをロック/同期することをお勧めします。
どうやってやるの?
この問題の詳細:
このコード(クロージャーがオンになっている戻り関数views
)を複数のゴルーチンで同時に実行します。
IO関数には時間がかかるようです。その結果、次のような出力が得られます。
正常にインクリメントしますが、印刷されると、printing+incrementingの操作がまったくアトミックではないことがわかります。
次のように変更した場合:
正常に動作しているようですが、最終的に失敗しないかどうかは完全にはわかりません...