Golang concurrency: Difference between revisions
No edit summary |
|||
Line 4: | Line 4: | ||
= Threading = | = Threading = | ||
<blockquote> | <blockquote> | ||
== Testing == | |||
<blockquote> | |||
<syntaxhighlight lang="go"> | |||
go run -race foo.go # run, checking for race conditions | |||
</syntaxhighlight> | |||
</blockquote><!-- Testing --> | |||
== Limits == | == Limits == | ||
<blockquote> | <blockquote> |
Revision as of 19:42, 6 June 2022
This page is about the methods of concurrency provided by go.
If you're looking for synchronization primitives (ex. mutexes, semaphores, ... see golang synchronization)
Threading
Testing
go run -race foo.go # run, checking for race conditionsLimits
Threads are a finite resource. You only have so many CPU cores, and CPU cores can only evaluate one thread at a time. Go defaults to allowing one thread per core, but you can generally get additional performance by increasing this.
require "runtime" runtime.GOMAXPROCS(-1) // show configured max-number of threads runtime.GOMAXPROCS(2) // set max-number of threadsGoroutines
TODO:
Is this really true? How are coroutines implemented?
Goroutines use green-threads rather than os-threads.
An OS thread is relatively expensive in setup and memory. One thread is reserved for a particular stack.
Go abstracts threads/threadpools with goroutines to make threads relatively cheap.func doThing() { fmt.Println("hi") } func main() { go sayHello() // <-- run in thread }Go functions default to using value objects rather than references.
Depending on your datastructure, this makes goroutines fairly concurrency-safe, since it operates on a copy of the data, rather than the same data.func printThing(a string) { fmt.Println(a) } go printThing("abc")OS Threads