以下は簡単な例です。私は、例を短くするために意図的にエラー処理などを省略しました。私は、関数を同時に実行させるために、goキーワードを使って5回writeOutput関数を呼び出す単純なforループを持っています。Golangは、並行処理の動作が期待通りに機能しないようにします。
テストの内容で/ tmp /に5つのファイルが作成されます。
ファイルが作成されないということが起こります。
ただし、goキーワードを削除すると、コードは期待通りに実行されます。私は何かを見過ごしています。私の背景は、PHP/Rubyのような動的に型付けされた言語なので、やりとりするだけで、goキーワードが存在すると5つのファイルが作成される理由を理解できません。
package main
import (
"os"
"math/rand"
"strconv"
)
func main() {
for i := 0; i < 5; i++ {
go writeOutput()
}
}
func writeOutput() {
filename := strconv.Itoa(rand.Intn(10000))
file, _ := os.Create("/tmp/" + filename)
defer file.Close()
file.WriteString("test")
}
main関数は、スケジューラが 'writeOutput'のいずれかのゴルーチンを実行する時間を待つ前に戻っています。 'sync.WaitGroup'を使ってすべてのゴルーチンが終了するまで待ちます。 –
@TimCooper私はあなたの提案を使用して問題を解決するために助けてくれてありがとう。私がその事例を改善できると思ったら教えてください。 –