Go Concurrency: Difference between revisions
Line 7: | Line 7: | ||
The majority of programming languages address concurrency by providing a representation of [[Concurrent_(Parallel)_Programming#O/S_Threads|O/S threads]] or [[Concurrent_(Parallel)_Programming#Green_Threads|green threads]] directly in the language or in libraries, and exposing [[Concurrent_(Parallel)_Programming#Memory_Access_Synchronization_Primitives|memory access synchronization primitives]] to protect data in presence of concurrent access. | The majority of programming languages address concurrency by providing a representation of [[Concurrent_(Parallel)_Programming#O/S_Threads|O/S threads]] or [[Concurrent_(Parallel)_Programming#Green_Threads|green threads]] directly in the language or in libraries, and exposing [[Concurrent_(Parallel)_Programming#Memory_Access_Synchronization_Primitives|memory access synchronization primitives]] to protect data in presence of concurrent access. | ||
Go takes a different approach. The fundamental concurrent execution primitive is the [[Go_Language_Goroutines#Overview|goroutine]], | Go takes a different approach. The fundamental concurrent execution primitive is the [[Go_Language_Goroutines#Overview|goroutine]], introduced in the language with the [[Go_Language#Keywords|keyword]] <code>[[Go_Language#go_keyword|go]]</code>. Goroutines are managed by the Go runtime, which maps them transparently onto threads. While Go provides memory access and thread synchronization primitives at the language level via the <code>[[Go_Package_sync|sync]]</code> package, language guidelines do not exactly encourage their use, unless in very specific situations, such as within a small <code>struct</code> scope. Go provides an alternative concurrency programming model in language, based on [[Concurrent_(Parallel)_Programming#Communicating_Sequential_Processes_(CSP)|Communicating Sequential Processes (CSP)]], a theoretical model introduced by Anthony Hoare in the "Communicating Sequential Processes" 1978 ACM paper. This concurrency programming model uses [[Go Language Channels#Overview|channels]], which are exposed at language level with the <code>[[Go_Language#chan_keyword|chan]]</code> keyword. | ||
This approach allows you to directly map concurrent problems into concurrent constructs instead of dealing with the minutia of starting and managing threads, and mapping logic evenly across available threads. In Go, programmers model concurrency in goroutines, as concurrent functions, and channels, and communication mechanisms between parallel functions. In languages that expose threads, you need to worry about things like thread pools, and map requests onto threads. In contrast, in Go you would write a function and prepend its invocation with the <code>go</code> keyword. The runtime handles everything else automatically. | This approach allows you to directly map concurrent problems into concurrent constructs instead of dealing with the minutia of starting and managing threads, and mapping logic evenly across available threads. In Go, programmers model concurrency in goroutines, as concurrent functions, and channels, and communication mechanisms between parallel functions. In languages that expose threads, you need to worry about things like thread pools, and map requests onto threads. In contrast, in Go you would write a function and prepend its invocation with the <code>go</code> keyword. The runtime handles everything else automatically. |
Revision as of 00:17, 16 January 2024
Internal
Overview
The majority of programming languages address concurrency by providing a representation of O/S threads or green threads directly in the language or in libraries, and exposing memory access synchronization primitives to protect data in presence of concurrent access.
Go takes a different approach. The fundamental concurrent execution primitive is the goroutine, introduced in the language with the keyword go
. Goroutines are managed by the Go runtime, which maps them transparently onto threads. While Go provides memory access and thread synchronization primitives at the language level via the sync
package, language guidelines do not exactly encourage their use, unless in very specific situations, such as within a small struct
scope. Go provides an alternative concurrency programming model in language, based on Communicating Sequential Processes (CSP), a theoretical model introduced by Anthony Hoare in the "Communicating Sequential Processes" 1978 ACM paper. This concurrency programming model uses channels, which are exposed at language level with the chan
keyword.
This approach allows you to directly map concurrent problems into concurrent constructs instead of dealing with the minutia of starting and managing threads, and mapping logic evenly across available threads. In Go, programmers model concurrency in goroutines, as concurrent functions, and channels, and communication mechanisms between parallel functions. In languages that expose threads, you need to worry about things like thread pools, and map requests onto threads. In contrast, in Go you would write a function and prepend its invocation with the go
keyword. The runtime handles everything else automatically.
Go's philosophy on concurrency can be summed up like this: aim for simplicity, use channels when possible, and thread goroutines as a free resource.
Goroutines
Programming Models
Go provides two main programming models when it comes to modeling concurrency in the program. The preferred way is based on communicating sequential processes (CSP) paradigm and encourages the use of channels. Memory access synchronization is available, but the language designers advise against using it as the first choice. This is a workflow to help selecting one model versus the other.
YES ┌──────────── Is it a performance critical section? │ │ NO │ │ │ ▼ YES │ Are you trying to transfer ownership of data? ──────────────┐ │ │ NO │ │ │ │ │ YES ▼ │ ├────── Are you trying to guard the internal state of a struct? │ │ │ NO │ │ │ │ │ NO ▼ YES │ ├────── Are you trying to coordinate multiple pieces of logic? ───────┤ │ │ ▼ ▼ Use Primitives Use Channels
Channels
Synchronization Primitives
The sync
package provides memory access and thread synchronization primitives.