問題タブ [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 - Goで無限のゴルーチンを停止するより良い方法はありますか?
ゴルーチンを使用して単純なクロック信号を作成しました。
この時計が不正確であることは知っていますが、それは関係ありません。私が知りたいのは、このゴルーチンを停止する最良の方法は何ですか?
理想的には、チャネルのリスナーが範囲外になるとすぐに停止することを望んでいましたが、その方法を知っています (ガベージ コレクターに似ていますが、ゴルーチン用です)。私はそれを手動で停止する 2 つの方法を考え出しました: (1) そのようなすべてのゴルーチンがすべてのループをチェックするグローバルな停止変数を使用する方法と、(2) 停止チャネルを使用する方法です。これらのそれぞれの欠点は、ゴルーチンを手動で停止する必要があることです。
concurrency - go ルーチンの奇妙な動作
次のコードを試してみましたが、結果は少し奇妙に思えます。最初に奇数を出力し、次に偶数を出力します。私はそれについて本当に混乱しています。1、2、3、4... のように、奇数と偶数を次々に出力することを望んでいました。誰が私を助けることができます?
java - Clojure / Java のゴルーチンに相当するもの
私は最近、Go Concurrency patterns に関する Google IO トークを見て楽しんでいました。
同時実行性に対する Go のアプローチ (グラルーチン、チャネルを介した通信) は明らかに Clojure とは異なりますが (不変性、管理された参照、STM)、Clojure コンテキストの状況によっては、Go のアプローチが依然として有用であるように思われました。
Clojure または Java for Go の同時実行プリミティブ (おそらくライブラリ) には、特に次のようなものがあります。
channel
リーダーとライターが両端で使用可能になるまでブロックするようなオブジェクトselect
複数のチャネルで結果を待つことができる のような構造
PS Clojure から簡単に使用できるので、Java ソリューションに完全に満足しています。
UPDATE質問が最初に尋ねられたので、Clojureには、このすべての機能などを提供するcore.asyncが含まれるようになりました。
go - GoのPythonスタイルのジェネレーター
私は現在TourofGoに取り組んでおり、特に質問66では、ゴルーチンがPythonジェネレーターと同様に使用されていると思いました。66は複雑に見えると思ったので、次のように書き直しました。
これはうまくいくようです。いくつかの質問:
- チャネルのバッファサイズを10とすると、
fibonacci
さらに10個のスポットができるだけ早くいっぱいになりmain
、スポットができるだけ早く使い果たされます。これは正しいですか?これは、メモリを犠牲にして1のバッファサイズよりもパフォーマンスが高くなりますよね? - チャネルは送信者によって閉じられないので、
fibonacci
ここでスコープから外れると、メモリに関して何が起こりますか?私の期待は、一度範囲外になるc
とgo fibonacci
、チャネルとその上のすべてのものがガベージコレクションされることです。私の腸は、これはおそらく何が起こるかではないと私に言います。
memory - goroutine のメモリ不足 UPD: go エラー処理
UPD : 結局のところ、Go でのエラー処理に関する質問です。
「メイン スレッド」で Web ページのアドレスを生成し、1 つの go-routine で実際のページを取得し、コンテンツを 経由で返しchan
、別の go- でファイルに書き込む単純な Web クローラーを作成しました。ルーティーン。ただし、このプロセスを約 300,000 回繰り返した後、次のエラーが発生します。
エラー「stacktrace」は非常に長く、残念ながら今はありません(実験を繰り返した後、後で投稿します)。
どういうわけかメモリを管理したり、チャネルを閉じたりする必要はありますか?
以下、一部省略したコードです。
go - この Go コードがブロックされているのはなぜですか?
次のプログラムを書きました。
チャネルのイベントリストはバッファリングされたチャネルなので、出力「Hey!」のちょうど 100 倍になるはずですが、表示されるのは 1 回だけです。私の間違いはどこですか?
select - golang: fmt.Print() を追加しない限り、選択した goroute が停止しません
Go Tourエクササイズ #71をやってみた
のようgo run 71_hang.go ok
に実行すると、正常に動作します。
ただし、 を使用するgo run 71_hang.go nogood
と、永久に実行されます。
唯一の違いは、ステートメントfmt.Print("")
内のエクストラです。default
select
よくわかりませんが、ある種の無限ループと競合状態が疑われますか? そして、これが私の解決策です。
注: Go がそうしなかったので、デッドロックではありませんthrow: all goroutines are asleep - deadlock!
concurrency - この Go コードがデッドロックになるのはなぜですか?
私はGoが初めてなので、どんな指針も素晴らしいでしょう。そのようなことをデバッグするにはどうすればよいですか?
スニペットhttp://play.golang.org/p/SCr8TZXQUEを実行できます
更新:これ <-time.After(time.Duration(id)*time.Millisecond)
は遊び場の行がなくても機能します。理由を知りたいですか?(@dystroy で述べたように、これはおそらく遊び場が時間を処理する方法によるものです)
ローカルで試してみると、これが出力です。
すべてのゴルーチンが完了しますが、とにかくデッドロックがスローされます。タイマーが使用されているかどうかは問題ではなく、どちらの方法でもデッドロックが発生することに注意してください。
parallel-processing - 並列化 - スリープが一時停止するのはなぜですか?
最初のゴルーチンだけを待つのはなぜですか
func Sleep(d Duration)
http://golang.org/pkg/time
"Sleep は現在のゴルーチンを期間 d 一時停止します。"
残りは直接実行されます。チャネルが原因だと思いますが、c chan string
両方の動作がわかりません。