問題タブ [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.

0 投票する
3 に答える
8214 参照

go - ポインター メソッドへの同時アクセスを行う

ポインターメソッドに同時アクセスするとどうなるかを理解しようとしていますか?

ポインターのマップがあり、いくつかの go ルーチンを生成します。各 go ルーチンにマップを渡すと、各 go ルーチンはマップ内の値の 1 つを使用します。読み取られるだけのマップには何も書き込まれません。

マップは小さく、4 つのキーしかないため、複数の go ルーチンがマップから同じ値を使用する可能性があります。

質問は、2 つの go ルーチンが同じポインターのメソッドを呼び出すとどうなるかということです。予測できない結果が得られますか?

編集

例: マップの部分を取り出しているのは、それは私が求めている質問ではないからです。

私はfooこれが型のポインタでMyStructあり、この構造にDoSomethingは引数を取るメソッドがあります。main関数で 2 つ作成していますが、両方とも異なる値を渡すgo routines呼び出しを行います。foo.DoSomethingこの例では、最初の go ルーチンは 2 番目のルーチンよりもはるかに大きな計算を実行します (ここではスリープ時間を使用して計算をシミュレートしています)。繰り返しますが、構造体は何も変更されていません。構造体メソッドを呼び出しているだけです。foo.DoSomething最初の go ルーチンがまだメソッドを操作しているときに、2 番目の go ルーチンが を呼び出すことを心配する必要はありますか?

0 投票する
4 に答える
31503 参照

go - ゴルーチン プールの使用方法

Go を使用して Yahoo ファイナンスから株価スプレッドシートをダウンロードしたいと考えています。独自のゴルーチンですべての株式に対して http リクエストを作成します。約 2500 個のシンボルのリストがありますが、2500 個のリクエストを並行して行うのではなく、一度に 250 個を作成することをお勧めします。Java では、スレッド プールを作成し、スレッドが解放されたときにスレッドを再利用します。似たようなもの、ゴルーチンプールを探していましたが、リソースを見つけることができませんでした。誰かが目の前のタスクを達成する方法を教えてくれたり、同じリソースを教えてくれたりしてくれれば幸いです。ありがとう!

0 投票する
1 に答える
442 参照

concurrency - Go の同時実行とチャネルの混乱

私は Go を初めて使用し、同時実行性とチャネルを理解するのに問題があります。

プログラムの出力は次のとおりです。

しかし、私はそれが1行だけであるべきだと思った:

そのため、メイン関数では <-c がブロックされ、他の 2 つの go ルーチンがチャネルにデータを送信するのを待ちます。メイン関数が c からデータを受け取ると、続行して終了する必要があります。

display と sum が同時に実行され、sum に時間がかかるため、display は c に true を送信し、プログラムは sum が終了する前に終了する必要があります...

私はそれを明確に理解しているかどうかはわかりません。誰かがこれで私を助けてくれますか? ありがとうございました!

0 投票する
5 に答える
30303 参照

multithreading - 一度に実行されるゴルーチンのプールをどのように定義しますか?

TL;DR: 最後の部分に進んで、この問題をどのように解決するか教えてください。

今朝、Python から Go を使い始めました。Go からクローズド ソースの実行可能ファイルを複数回呼び出したいのですが、少し並行して、さまざまなコマンド ライン引数を使用します。私の結果のコードはうまく機能していますが、改善するためにあなたの意見を求めたいと思います。私は学習の初期段階にあるので、ワークフローについても説明します。

簡単にするために、ここでは、この「外部のクローズド ソース プログラム」がzenity、コマンド ラインからグラフィカル メッセージ ボックスを表示できる Linux コマンド ライン ツールであると仮定します。

Go から実行可能ファイルを呼び出す

したがって、Go では、次のようになります。

これは正しく機能するはずです。は、その後に続く.Run()と機能的に同等であることに注意してください。これは素晴らしいことですが、このプログラムを 1 回だけ実行したい場合、プログラミング全体を行う価値はありません。だから、それを何度もやってみましょう。.Start().Wait()

実行可能ファイルを複数回呼び出す

これが機能するようになったので、カスタム コマンド ライン引数を使用してプログラムを複数回呼び出したいと思います (ここでiは簡単にするため)。

わかりました、やった!しかし、Go が Python より優れている点はまだわかりません。このコードは、実際にはシリアル方式で実行されます。私はマルチコア CPU を持っており、それを活用したいと考えています。それでは、ゴルーチンで並行性を追加しましょう。

ゴルーチン、またはプログラムを並列化する方法

a)最初の試み:どこにでも「go」を追加するだけです

コードを書き直して、呼び出しと再利用を容易にし、有名なgoキーワードを追加しましょう。

何もない!何が問題ですか?すべてのゴルーチンが一度に実行されます。zenityが実行されない理由はよくわかりませんが、私の知る限り、zenity外部プログラムが初期化される前にGoプログラムが終了しました。これは の使用によって確認されましtime.Sleepた。数秒待つだけで、zenity の 8 インスタンスが起動するのに十分でした。ただし、これがバグと見なされるかどうかはわかりません。

さらに悪いことに、私が実際に呼び出したい実際のプログラムは、それ自体を実行するのに時間がかかります。このプログラムの 8 つのインスタンスを 4 コアの CPU で並行して実行すると、多くのコンテキスト切り替えを行うのに時間がかかることになります…単純な Go ゴルーチンがどのように動作するかはわかりませんがexec.Command 8 つの異なるスレッドで zenity を 8 回起動します。 . さらに悪いことに、このプログラムを 10 万回以上実行したいと考えています。これらすべてをゴルーチンで一度に行うのは、まったく効率的ではありません。それでも、4コアCPUを活用したい!

b) 2 回目の試行: ゴルーチンのプールを使用する

sync.WaitGroupオンライン リソースでは、この種の作業に を使用することを推奨する傾向があります。このアプローチの問題点は、基本的にゴルーチンのバッチで作業していることです。4 つのメンバーの WaitGroup を作成すると、Go プログラムは4 つの外部プログラムすべてが終了するのを待ってから、4 つのプログラムの新しいバッチを呼び出します。これは効率的ではありません。CPU が再び浪費されます。

他のリソースでは、バッファリングされたチャネルを使用して作業を行うことを推奨しています。

これは醜いようです。チャネルはこの目的のために意図されたものではありません: 私は副作用を悪用しています. のコンセプトは気に入っていdeferますが、作成したダミー チャネルから値を取り出す関数 (ラムダであっても) を宣言する必要はありません。ああ、もちろん、ダミー チャネルを使用すること自体が醜いことです。

c) 3 回目の試行: すべての子供が死亡した時点で死亡

これでほぼ完成です。もう 1 つの副作用を考慮に入れる必要があります。すべての zenity ポップアップが閉じる前に Go プログラムが閉じます。これは、ループが (8 回目の繰り返しで) 終了すると、プログラムの終了を妨げるものがないためです。今回sync.WaitGroupは重宝します。

終わり。

私の質問

  • 一度に実行されるゴルーチンの数を制限する他の適切な方法を知っていますか?

スレッドのことではありません。Go がゴルーチンを内部で管理する方法は関係ありません。つまり、一度に起動されるゴルーチンの数を制限するというexec.Commandことです。呼び出されるたびに新しいスレッドが作成されるため、呼び出される回数を制御する必要があります。

  • そのコードは問題ないように見えますか?
  • その場合、ダミーチャンネルの使用を避ける方法を知っていますか?

そのようなダミーチャンネルが道であるとは思えません。

0 投票する
1 に答える
2081 参照

concurrency - Goは、ゴルーチン間のコンテキスト切り替えのタイミングをどのように決定しますか?

Go言語がゴルーチンをどのようにスケジュールするかについて興味があります。チャネル要求と I/O の間だけ切り替えますか、それとも定期的なコルーチン切り替えループがありますか?

0 投票する
3 に答える
320 参照

go - 最初のゴルーチンの例、奇妙な結果

この例はtour.golang.org/#63から取得しました

出力

の代わりに 回worldだけが表示されるのはなぜですか?45


編集:答えはgolangの仕様から引用できます:

プログラムの実行は、メイン パッケージを初期化し、関数 main を呼び出すことによって開始されます。関数 main が戻ると、プログラムは終了します。他の (メインではない) ゴルーチンが完了するのを待ちません。