問題タブ [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.
methods - 並行メソッドを取得する方法
並行メソッドを取得するにはどうすればよいですか?
Get()メソッドのすべてのコードをの中に入れgo func()てから、チャネルを使用する 必要があると思います。
- から別のメソッドを呼び出すと問題が発生し
Get()ますか?それとも同時である必要がありますか?
go - 完了時にチャネル結果をキューに追加するより慣用的な方法
したがって、今は、Queueオブジェクトへのポインタを渡し(実装は実際には重要ではありません)queue.add(result)、キューに物事を追加する必要があるゴルーチンの最後で呼び出します。
同じ種類の機能が必要です。もちろん、コンマok構文を使用してループチェックの完了を行うことは、単純なキュー追加関数呼び出しと比較して、パフォーマンスの観点からは受け入れられません。
これをより良くする方法はありますか?
go - ミューテックスの代わりに Go でチャネルを使用するにはどうすればよいですか?
チャネルは、通信 (値の交換) と同期を組み合わせて、2 つの計算 (ゴルーチン) が既知の状態であることを保証します。
Google Go のチャネルを使用してミューテックスの機能を実行するにはどうすればよいですか?
haskell - HaskellでGoのチャンネルをエミュレートするにはどうすればよいですか?
最近、Goプログラミング言語について読み始めましたが、チャネル変数が非常に魅力的な概念であることがわかりました。Haskellで同じ概念をエミュレートすることは可能ですか?たぶんChannel a、キーワードのように機能する可変状態と機能を有効にするために、データ型とモナド構造を持っているでしょうgo。
私は並行プログラミングがあまり得意ではなく、Haskellのこのような単純なチャネル受け渡しメカニズムは私の人生を本当に楽にしてくれるでしょう。
編集
人々は私がHaskellに翻訳することに興味を持ったGoのパターンの種類を明確にするように私に頼みました。そのため、Goにはファーストクラスのチャネル変数があり、関数で受け渡しして返すことができます。これらのチャネルの読み取りと書き込みができるため、同時に実行できるルーチン間で簡単に通信できます。Goにはgoキーワードもあり、言語仕様に従って、独立したスレッドとして同時に関数の実行を開始し、待機せずにコードを実行し続けます。
私が興味を持っている正確なパターンは次のようなものです(Goの構文は奇妙です-変数は通常の逆の方法ではなくvarName varTypeによって宣言されます-しかし私はそれが読みやすいと思います):
私の主な関心は、モンテカルロシミュレーションを実行することです。このシミュレーションでは、システムの現在の状態を変更しようとし、いくつかの基準を満たしている場合は変更を受け入れることで、構成を順番に生成します。
これらのチャネルのものを使用して、マルチコアプロセッサで並行して実行される非常にシンプルで読みやすく小さなモンテカルロシミュレーションを作成できたという事実は、私に本当に感銘を与えました。
問題は、Goにはいくつかの制限があることです(特に、Haskellで慣れている方法でポリモーフィズムが欠けています)。それに加えて、私はHaskellが本当に好きで、それを交換したくありません。したがって、問題は、上記のコードのようなメカニズムを使用して、Haskellで並行シミュレーションを簡単に実行する方法があるかどうかです。
EDIT(2、context): 私はコンピューターサイエンス、特に並行性については学んでいません。私は、CSとはまったく関係のない分野で、日常の研究ルーチンで単純な問題を解決するための単純なプログラムを作成するだけの人です。Haskellの仕組みが面白くて、それを使ってちょっとした雑用をするのが好きです。
パイ計算やCSPチャネルだけについて聞いたことはありません。質問が不適切に思われる場合は申し訳ありませんが、それはおそらく私の大きな無知のせいです。
そうです、私はGoのどのパターンをHaskellで複製したいかについてより具体的にする必要があります。そして、質問をより具体的に編集しようとします。しかし、深い理論的な質問を期待しないでください。問題は、私が読んでコーディングしたいくつかのことから、Goには並行性を実行するための優れた方法があるようです(私の場合、これは、すべてのコアを数値計算でハミングさせるという私の仕事が簡単であることを意味します)、そしてHaskellで同様の構文を使用できれば、嬉しいです。
go - ゴルーチンを止める方法
メソッドを呼び出し、チャネルに戻り値を渡すゴルーチンがあります。
どうすればそのようなゴルーチンを止めることができますか?
go - 「すべてのゴルーチンがスリープ状態です - デッドロック!」という次の go コードの何が問題になっていますか?
ここで提案されているオブザーバー パターンを実装しようとしています。Go 言語のオブザーバー パターン
(上記のコードはコンパイルされず、不完全です)。ここに、コンパイルされる完全なコードがありますが、デッドロック エラーが発生します。
また、「quit」を完全に取り除くと、エラーは発生しませんが、最初のレコードのみが出力されます。
sockets - 多くのクライアントがGoサーバーに接続するときのエラー
完全なコードはhttps://groups.google.com/forum/#!topic/golang-nuts/e1Ir__Dq_gEからダウンロードできます。
誰かがこのサンプルコードをバグゼロに改善するのを手伝ってもらえますか?バグのないクライアント/サーバーコードを開発するのに役立つと思います。
私の開発手順:
- goroutineで複数の接続を処理できるサーバーを作成します。
- 単純なプロトコルで正常に動作するクライアントを構築します。
- クライアントを拡張して、複数のクライアントをシミュレートします(オプション-n = 1000クライアントをデフォルトとして使用)
- TODO:サーバーのロックを減らすようにしてください
- TODO:スループットを向上させるためにbufioを使用してみてください
このコードは非常に不安定で、次の3つの問題があります。
- 1000クライアントを起動します。そのうちの1つは、サーバーからの読み取り時にEOFを発生させます。
- 1050クライアントを起動し、すぐに開いているファイルが多すぎます(開いているクライアントはありません)。
1020クライアントを起動し、長いトレーススタックでランタイムエラーが発生しました。
/li>
ここに、より単純化したコードを貼り付けます。
go - すべてのゴルーチンがスリープ状態です - デッドロック! - - - - エラー
相互に整数を送信する 3 つの同時進行の go ルーチンを作成したいと考えています。これで、コードは適切にコンパイルされましたが、最初の実行後に「すべてのゴルーチンがスリープ状態です - デッドロック!」というエラーが発生します。エラーを見つけようとしましたが、コードロジックでエラーを見つけることができませんでした。コードの間違いを見つけるのを手伝ってくれますか? 私のコードを以下に示します。前もって感謝します。
Routine2 と Routine3 を go ルーチンとして宣言すると、なぜ出力が [出力なし] になるのか、誰か教えてください。私は GO が初めてで、「http://golang.org/doc/effective_go.html#concurrency」から理解したように、go は同じアドレス空間で他のゴルーチンと並行してゴルーチンを実行するために使用されます。では、すべてのルーチンが実行されているのに、出力が [出力なし] であるという問題は何ですか。
プログラムをより明確にするために:実際に私がするのは、2つのルーチンごとに2つのチャネルを作成し、1つのチャネルを使用してintを他のチャネルに送信し、そのルーチンから別のチャネルでintを受信することです。たとえば、ルーチン 1 と 3 の間のチャネルは command13 と response13 です。ルーチン 1 は、command13 を使用して int を送信し、response13 を使用してルーチン 3 との間で int を受信します。さて、3 つのルーチンが並行しており、受信メッセージまたは送信メッセージを処理する特定のルーチンがあるのに、なぜデッドロックに陥るのでしょうか?
go - すべての goroutine をスローしてスリープ状態にする - デッドロック! ------- Google の GO のエラー
相互に整数を送信する 3 つの同時進行の go ルーチンを作成したいと考えています。これで、コードは適切にコンパイルされましたが、最初の実行後に「スロー: すべてのゴルーチンがスリープ状態です - デッドロック!」というエラーが発生します。エラーを見つけようとしましたが、コードロジックでエラーを見つけることができませんでした。コードの間違いを見つけるのを手伝ってくれますか? 私のコードを以下に示します。
concurrency - Goプログラミング言語相互同時実行
私は以下のような2つの同時goルーチンを持っています、
いくつかの組み込み関数を使用してクリティカルセクションを実装することは可能ですか?