問題タブ [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 - 他のゴルーチンを一時停止して再開するエレガントな方法はありますか?
私の場合、何千ものゴルーチンが同時に動作していwork()
ます。sync()
ゴルーチンもありました。開始時sync
に、同期ジョブが完了した後、しばらく一時停止するために他のゴルーチンが必要です。これが私のコードです:
ここでの問題は、<-
が読み取り時に常にブロックしているため、 に行くたびにブロックしてsync_stat := <- channel
いることです。チャネルが閉じられていてもブロックされないことはわかっていますがwork()
、終了するまでこのチャネルを使用する必要があるため、閉じられたチャネルを再開する方法が見つかりませんでした。
私は間違った方法で自分自身を疑っていますので、どんな助けも大歓迎です。他のゴルーチンを一時停止して再開する「エレガントな」方法はありますか?
go - ゴルーチンはどのように機能し、メイン プロセスが終了すると終了するのでしょうか?
1000 万のレコードを mongodb に挿入する簡単な例を作成しました。順番に機能させることから始めました。次に、並行処理の方法を調べたところ、ゴルーチンが見つかりました。これは私が望んでいるように思えますが、期待どおりに動作していません。すべてのゴルーチンが終了する前にプログラムが終了するのをブロックする WaitGroup を実装しましたが、まだ問題があります。
そこで、何が起こっているのかから始めて、コードを示します。ゴルーチンなしでコードを実行すると、1,000 万件のレコードすべてが mongodb に正常に挿入されます。ただし、ゴルーチンを追加すると、不確定な量が入力されます..一般的には約8500で、数百です。mongodb ログをチェックして、問題が発生していないかどうかを確認しましたが、何も表示されていません。だから、ログに記録されていないだけなのかどうかはわかりません。とにかく、ここにコードがあります:
(補足: 一度に 1 つのレコードを処理していますが、将来的に複数のレコードを一度にテストできるようにメソッドに分割しました。mongodb でそれを行う方法がわかりません。まだ。)
concurrency - n ゴルーチンの終了を待つ
大量のゴルーチンを開始し、それらの終了を待つ必要があります。直感的な方法は、チャネルを使用してすべてが完了するまで待機するようです。
しかし問題は、オブジェクトの量、したがってゴルーチンの量が変化する可能性があることです。チャネルのバッファ サイズを変更することはできますか?
これを行うためのよりエレガントな方法はありますか?
memory-leaks - ガベージ コレクターは、決して続行されない Go ルーチンを収集しますか?
簡単な例として、次のコードを検討してください。
この関数は、生成されたデータを出力provide
する go ルーチンを作成します。printer
provide
私の質問は、空のチャネルでprovide
戻ってブロックを開始した後に何が起こるかということです。printer
これ以上の参照がないため、go ルーチンはリークしますc
か、それともガベージ コレクターがこのケースをキャッチして、go ルーチンと の両方を破棄しc
ますか?
この種のコードが実際にメモリ リークを引き起こす場合、そのようなメモリ リークの発生を防ぐためにどのような戦略を立てることができますか?
go - ネットワーク I/O を伴うゴルーチンがブロックされるのはなぜですか?
Ubuntu 13.04でgo 1.1 develを使用しています
http://golang.org/doc/faq#goroutinesによると
ブロッキング システム コールの呼び出しなどによってコルーチンがブロックされると、ランタイムは、同じオペレーティング システム スレッド上の他のコルーチンを別の実行可能なスレッドに自動的に移動して、ブロックされないようにします。
私はゴルーチンを使用して大きなファイルをチャンクでダウンロードできるダウンローダを作成しようとしていますが、これは私が思いついた最高のゴルーチンです:
完全なスクリプトは、https://github.com/tuxcanfly/godown/blob/master/godown.goで入手できます。
ファイルは正しくダウンロードされ、保存されていますが、2 番目のチャンクは最初のチャンクが終了したときにのみ開始されることがわかります。
チャンク化されたダウンロードを並行して実行するべきではありませんか、それとも何か間違っていますか?
go - 標準ライブラリまたはサードパーティの Golang パッケージを Goroutines で適切に使用するには?
Golang プログラマーの皆さん、こんにちは。
まず最初に、私の質問が最初はあまり明確でない場合はお詫びしますが、標準ライブラリまたは他のライブラリを使用するときに Goroutines を使用する Golang コードを作成する際の適切な使用パターンを理解しようとしています。
詳しく説明しましょう: 私が利用したい文書を書いていないパッケージをインポートするとします。このパッケージが、たとえば Flickr などの Web サイトに対して単純な http get 要求を行うとします。同時リクエストが必要な場合は、関数呼び出しの前に go キーワードを付けるだけです。しかし、リクエストを実行するときにこのパッケージが内部 go 呼び出し自体をまだ実行していないため、go 呼び出しが冗長になっていることをどのように知ることができますか?
Golangパッケージは通常、ドキュメントでメソッドが「グリーン化されている」と言っていますか? それとも、2 つのバージョンのメソッドを提供しているのでしょうか。
Go のイディオムと使用パターンを理解しようとする中で、標準ライブラリのパッケージを使用していても、go コマンドが必要かどうかわからないような気がします。呼び出しのプロファイルを作成したり、テスト コードを記述したりできると思いますが、関数が既に「グリーン」であるかどうかを判断する必要があるのは奇妙に感じます。
もう 1 つの可能性は、私が使用しているもののソース コードを調べて、それをどのように使用すべきか、および go キーワードが必要かどうかを理解するのは私次第であるということです。
誰かがこれに光を当てたり、適切なドキュメントや Golang のスクリーンキャストを教えてくれたりしたら、とても感謝しています。Rob Pike が 1 つの講演で、go で記述された優れたクライアント API は典型的な同期方式で記述されているだけであり、それをグリーンにするかどうかを選択できるのはその API の呼び出し元であると簡単に述べていると思います。
御時間ありがとうございます、
-ラルフ