問題タブ [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.
multithreading - goroutines が完了するのではなく、お互いを待つのはなぜですか?
私は Go にかなり慣れていないのですが、私のコードには理解できないことが 1 つあります。簡単なバブルソート アルゴリズムを作成しました (あまり効率的ではないことはわかっています ;))。ここで、3 つの GoRoutine を開始します。各スレッドは、他のスレッドとは独立して配列をソートする必要があります。終了したら、fun. 「完了」メッセージを出力する必要があります。
ここに私のコードがあります:
これは私が得るものです:
彼のスライスが最小なので、スレッド 2 を最初に終了するべきではありませんか? スライスがどれほど大きくても、「完了」メッセージが同時に表示されるため、すべてのスレッドが他のスレッドの終了を待っているようです..
私のブレインバグはどこですか?=)
前もって感謝します。
*編集:バブルソート機能のforループに「time.Sleep(1)」を入れるとき。それはうまくいくようです..しかし、このコードを使用してさまざまなマシンで期間を計りたいので(ランダムなものを変更する必要があることはわかっています)、スリープすると結果が改ざんされます。
windows - シンプルなゴルーチンが Windows で動作しない
ゴルーチンがどのように機能するかを知るためだけに、ゴルーチンを使用していくつかのテストを行っていますが、まったく実行されていないようです。私は非常に簡単なテストを行いました:
私はこれが「テスト」を出力することを期待していますが、単に何もせず、メッセージもエラーもありません。また、プログラムの最後にa を追加しfor {}
て、ゴルーチンに何かを印刷する時間を与えようとしましたが、それは役に立ちませんでした。
何が問題になる可能性がありますか?
concurrency - 複数のゴルーチンをstdoutに印刷しても安全ですか?
プログラムに複数のゴルーチンがあり、それぞれがfmt.Println
明示的な同期なしでを呼び出します。これは安全ですか(つまり、データが破損することなく各行が別々に表示されますか)、または印刷を処理するために同期を使用して別のゴルーチンを作成する必要がありますか?
go - ゴルーチンの応答を追跡するより良い方法はありますか?
私はゴルーチンに頭を悩ませようとしています。複数の検索エンジンで同じ検索を並行して実行する簡単なプログラムを作成しました。現時点では、回答数を追跡するために、受け取った数を数えています。ちょっと素人っぽいけど。
次のコードのすべてのゴルーチンからいつ応答を受け取ったかを知るより良い方法はありますか?
go - Goでのデッドロック、2つのルーチン分割作業
私は外出先でデッドロックの問題に少し立ち往生しています。
このプログラムは、intの配列aを取り、それを2つに分割します。次に、これら2つの部分を2つの異なるルーチンに取り、すべての要素を合計します。この後、チャネルresで2つの結果を送信することになっています。次に、2つの解像度(現在はch)を足して、印刷する必要があります。
私の問題:クローズ関数を頻繁に移動することでデッドロックの問題に対処しようとしましたが、何も役に立たないようです。明らかに1つのルーチンAddを実行するだけでうまく機能します。
php - Adapt php parallel execution function for Windows?
Here is a function to execute an array of commands in parallel and return an array of results, optionally filtered by a callback function and a limit to the number of processes, it runs great on my Mac in Lion:
Here is an example of calling it with an anonymous function and a limit of 64 threads in php 5.3:
The output is a sequence of numbers up to 128 and then roughly 128 timestamps, depending on clock accuracy and if some of the other processes finished or not. The filter is handy for bailing midway if something goes wrong.
You can play around with changing the process limit from 64 to 1 to see the results arrive serially, or commenting out the $key == 128 line to prevent stopping. If you don't set a process number limit, it opens as many file handles to the processes as it can and waits for more to become available internally.
The way it works is, it's almost identical to shell_exec() but launches the process in the background and continues execution. It pipes any warnings about broken pipes to null, in case you shut down the processes prematurely by closing the handles.
My problem is, I need to make it cross-platform but don't have easy access to a PC or to all of the flavors of Windows like NT. Here's my TODO list:
- fread() blocks on Windows because stream_set_blocking() is a NOP. Could maybe work around this with fread(1) but it's only pseudo-preemptive. Need a way to peek if there are bytes waiting, maybe with select or making the stream nonblocking a different way somehow.
- spawn processes in the background, probably with "START /B [command]". This really needs to work similarly to the "&" in unix, and not generate extra output, block stout or force it to only be accessible through a file, force the user to create a batch file or other weirdness. It might require the use of proc_ open() or pcntl_fork() or something completely different, I'm not really sure.
- explore using curl_multi or another thread tool to spawn functions and call shell_exec() inside them as usual (this needs to be done in a way that doesn't involve installation of any extra libraries).
- use a good test like DIRECTORY_SEPARATOR == '\' to run a separate code branch on Windows.
- need some better test cases on Windows, maybe "TIMEOUT [seconds]" or "PING -n [milliseconds] 127.0.0.1>nul" without output.
This all started because I'm trying to simulate something like a goroutine in php, where you can spawn up to N processes and it just blocks if you reach a limit until more are available, then returns the results. I'm constantly needing to speed up large tasks that should be trivially easy to parallelize, but php makes it difficult because their hands are tied due to a bunch of OS-specific minutia.
So I think whoever comes up with a solid cross-platform version of this function, or something very similar to a goroutine that "just works", would find that their code is quite popular. My guess is that this function falls back to running serially on Windows right now.
Thanks in advance for your help, and good luck!
go - 特定のゴルーチンを実行するために time.sleep が必要なのはなぜですか?
GO チュートリアルには、次のスライドがあります。
このコードを実行すると、期待どおりの結果が得られます (「world」と「hello」が交互に 5 回画面に表示されます)。
ただし、コメントアウトtime.Sleep
(およびその結果、"time"
インポートの行) を実行してプログラムを再度実行すると、画面に「hello」が 5 回書き込まれるだけです。
time.Sleep
ゴルーチンを死なせないために重要なことは何ですか?
go - ブロックされた場合、go チャネルは順序を保持しますか?
すべて同じメッセージを受信するチャネルのスライスがあります。
ただし、各チャネルはchans
異なる速度で読み取られる可能性があるため、コンシューマが遅いときに他のチャネルをブロックしたくありません。私はゴルーチンでこれを解決しました:
ただし、各チャネルに渡されるメッセージの順序は重要です。仕様を調べて、ブロックされたときにチャネルが順序を保持するかどうかを確認しましたが、見つかったのはこれだけでした:
容量が 0 より大きい場合、チャネルは非同期です。バッファーがいっぱいでない (送信) または空でない (受信) 場合、通信操作はブロックされることなく成功し、要素は送信された順序で受信されます。
私にとって、書き込みがブロックされている場合、それは「送信」されていませんが、送信されるのを待っています。その前提で、上記は、書き込み時に複数のゴルーチンがブロックされている場合の送信順序について何も述べていません。
チャネルのブロックが解除された後の送信順序について保証はありますか?
go - MongoDB データベースを GO ルーチンに渡す方法は?
私は Go が初めてで、「mgo」パッケージを使用して、MongoDB データベース内のすべてのユーザーを反復処理し、ユーザーごとにすべての投稿を反復処理する単純なプログラムを作成しようとしています。
handleUser(db, &result)
これは問題なく動作していますが、handleUser 内の 2 番目のクエリへの呼び出しを変更しようとしてgo handleUser(db, &result)
も何もしません。
「メイン」がすでに終了しているため、セッションはすでに閉じられていると思われますが、正しいですか? もしそうなら、そのようなシナリオを処理する方法は何ですか?