In diesem Go-Code führt die Funktion test() mehrere Simulationen parallel aus. Das Hinzufügen von Parallelität verlangsamt jedoch das Programm.
Das Problem liegt in der Interaktion der Simulationen mit dem Zufallszahlengenerator. Standardmäßig verwendet das Go-Rand-Paket eine globale Instanz des Rand-Typs, die durch eine Mutex-Sperre geschützt ist. Bei Verwendung der Komfortfunktion rand.Float64() muss jede Goroutine diese Sperre erwerben, wodurch ein Engpass entsteht, der das Programm verlangsamt.
Um den Code zu parallelisieren Erstellen Sie effektiv für jede Goroutine eine separate Instanz des Rand-Typs. Dadurch entfällt die Notwendigkeit von Mutex-Sperren und ermöglicht den unabhängigen Betrieb der Goroutinen.
Beispielcode:
// Create a new Rand instance for each goroutine source := rand.NewSource(time.Now().UnixNano()) generator := rand.New(source)
Verwendung:
Übergeben Sie die Generatorinstanz an Funktionen wie „interaction()“ und „simulation()“, um Zufallszahlen ohne Mutex-Sperre zu generieren Konkurrenz.
result := interaction(generator)
Durch die Behebung des Mutex-Sperrproblems kann der Code nun die Parallelität vollständig nutzen, um die Simulationen zu beschleunigen.
Das obige ist der detaillierte Inhalt vonWarum verlangsamt die Parallelität meine Go-Game-Item-Drop-Simulation und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!