[解決済み] ゴルーチン最大数
2023-06-23 10:22:27
質問
ゴルーチンは何個までなら無痛で使えますか?例えばwikipediaによると、Erlangではパフォーマンスを低下させることなく2000万プロセスを作成することができるそうです。
更新しました。 私はちょうど ゴルーチンの性能について調査しました。 を少し調べてみたところ、このような結果になりました。
- ゴルーチンの寿命は sqrt() を 1000 回計算するよりも長いようです (私の場合 ~45µs) 、唯一の制限はメモリです。
- ゴルーチンのコスト 4 - 4.5 KB
どのように解決するのですか?
ゴルーチンがブロックされた場合、それ以外のコストは発生しません。
- メモリ使用量
- より遅いガベージコレクション
コスト(メモリと実際にゴルーチンの実行を開始するまでの平均時間)は、以下の通りです。
Go 1.6.2 (April 2016)
32-bit x86 CPU (A10-7850K 4GHz)
| Number of goroutines: 100000
| Per goroutine:
| Memory: 4536.84 bytes
| Time: 1.634248 µs
64-bit x86 CPU (A10-7850K 4GHz)
| Number of goroutines: 100000
| Per goroutine:
| Memory: 4707.92 bytes
| Time: 1.842097 µs
Go release.r60.3 (December 2011)
32-bit x86 CPU (1.6 GHz)
| Number of goroutines: 100000
| Per goroutine:
| Memory: 4243.45 bytes
| Time: 5.815950 µs
4GBのメモリをインストールしたマシンでは、これによりゴルーチンの最大数は100万をわずかに下回る程度に制限されます。
ソース コード (上に印刷されている数字をすでに理解している場合は、これを読む必要はありません)。
package main
import (
"flag"
"fmt"
"os"
"runtime"
"time"
)
var n = flag.Int("n", 1e5, "Number of goroutines to create")
var ch = make(chan byte)
var counter = 0
func f() {
counter++
<-ch // Block this goroutine
}
func main() {
flag.Parse()
if *n <= 0 {
fmt.Fprintf(os.Stderr, "invalid number of goroutines")
os.Exit(1)
}
// Limit the number of spare OS threads to just 1
runtime.GOMAXPROCS(1)
// Make a copy of MemStats
var m0 runtime.MemStats
runtime.ReadMemStats(&m0)
t0 := time.Now().UnixNano()
for i := 0; i < *n; i++ {
go f()
}
runtime.Gosched()
t1 := time.Now().UnixNano()
runtime.GC()
// Make a copy of MemStats
var m1 runtime.MemStats
runtime.ReadMemStats(&m1)
if counter != *n {
fmt.Fprintf(os.Stderr, "failed to begin execution of all goroutines")
os.Exit(1)
}
fmt.Printf("Number of goroutines: %d\n", *n)
fmt.Printf("Per goroutine:\n")
fmt.Printf(" Memory: %.2f bytes\n", float64(m1.Sys-m0.Sys)/float64(*n))
fmt.Printf(" Time: %f µs\n", float64(t1-t0)/float64(*n)/1e3)
}
関連
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] response.Bodyを閉じないとどうなりますか?
-
[解決済み] GoのToString()関数
-
[解決済み] Goでスライスを逆に反復処理する方法はありますか?
-
[解決済み] ゴルーチンのスタックトレースをダンプするには?
-
[解決済み] ゴルーチンからの戻り値をキャッチする
-
[解決済み] golangにおけるバックティック(``)とダブルクォート("")の違いは何ですか?
-
[解決済み] 複数のゴルーチンが1つのチャンネルをリッスンする
-
[解決済み] go get で「インポートパスが認識されない」。
-
[解決済み] env varが空の場合、どのようにデフォルト値を割り当てるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] GoのToString()関数
-
[解決済み] スライスを変数入力として渡すには?
-
[解決済み] GoLangで文字列を比較するにはどうしたらいいですか?
-
[解決済み] 複数のファイルからなるGoプログラムをコンパイルするには?
-
[解決済み] golangのスライスで要素を検索する方法
-
[解決済み] go ウェブサーバーを使って静的な html ファイルを提供するにはどうすればよいですか?
-
[解決済み] 文字列がint型かどうかチェックする
-
[解決済み] 標準入力から整数を読み込む
-
[解決済み] Goで配列をスライスに変換する
-
[解決済み] go.sum ファイルは git リポジトリにチェックインする必要がありますか?