私はマンデルブロ集合を計算し、外出先プログラムを実行していますよ。 gouroutineはすべてのピクセルに対して収束を計算するために開始されます。このプログラムは、pixelLengthx = 1000
、pixelLengthy = 1000
に対して正常に実行されます。私はpixelLengthx = 4000
、pixelLengthy = 4000
で同じコードを実行した場合 、プログラムは数十秒後にこれを印刷を開始:1600万ゴルーチン - 「GC待ちを支援する」
goroutine 650935 [GC assist wait]:
main.converges(0xa2, 0xb6e, 0xc04200c680)
.../fractals/fractals.go:41 +0x17e
created by main.main
.../fractals/fractals.go:52 +0x2af
プログラムが終了し、ちょうど印刷を継続しません。
package main
import (
"image"
"image/color"
"image/draw"
"image/png"
"log"
"math/cmplx"
"os"
"sync"
)
var sidex float64 = 4.0
var sidey float64 = 4.0
var pixelLengthx int = 4000
var pixelLengthy int = 4000
var numSteps int = 100
func converges(wg *sync.WaitGroup, i, j int, m *image.RGBA) {
wht := color.RGBA{255, 50, 128, 255}
plx := float64(pixelLengthx)
ply := float64(pixelLengthy)
fi := float64(i)
fj := float64(j)
c := complex((fi-plx/2)/plx*sidex, (fj-ply/2)/ply*sidey)
zn := complex(0, 0)
for k := 0; k < numSteps; k++ {
zn = cmplx.Pow(zn, 2) + c
}
if cmplx.Abs(zn) > 0.1 {
m.Set(i, j, wht)
}
wg.Done()
}
func main() {
err := Main()
if err != nil {
log.Fatal(err)
}
}
func Main() error {
m := image.NewRGBA(image.Rect(0, 0, pixelLengthx, pixelLengthy))
blk := color.RGBA{0, 0, 0, 255}
draw.Draw(m, m.Bounds(), &image.Uniform{blk}, image.ZP, draw.Src)
numGoroutines := pixelLengthx * pixelLengthy
wg := &sync.WaitGroup{}
wg.Add(numGoroutines)
for x := 0; x < pixelLengthx; x++ {
for y := 0; y < pixelLengthy; y++ {
go converges(wg, x, y, m)
}
}
wg.Wait()
f, err := os.Create("img.png")
if err != nil {
return err
}
defer f.Close()
err = png.Encode(f, m)
if err != nil {
return err
}
return nil
}
ここでは何が起こっていますか?なぜプログラムは何かを印刷しますか?
私は、外出先のバージョンgo1.8ウィンドウ/ AMD64を使用しています。
Memory usage during program execution.
スタックトレースをクラッシュさせて印刷しようとしています。一度に1,600万のゴルーチンを開始しようとしています。それが効率的にスケジュールされていても、それを行うためのシステムリソースはありますか? goroutine' 'ため – JimB
最小スタックサイズは、従って、16M、メモリの少なくとも32ギガバイトを必要とする、[2キロバイト(https://golang.org/doc/go1.4#runtime)です。 – putu
16Mのゴルーチンを開始する技術的な理由はありますか?または、挑戦するだけです。いくつのゴルーチンが受け入れられるのか? – Volker