Go coroutine is a lightweight thread provided by the Go language and is managed by the Go runtime. Are functions that run simultaneously with other functions, which are the basis for concurrent execution of code.
Add the go keyword before the function call, and this call will be executed concurrently in a new goroutine. This goroutine also ends automatically when the called function returns.
It should be noted that if this function has a return value, the return value will be discarded.
Go coroutines communicate through channels, simply put, the communication pipeline between multiple coroutines. Channels can prevent resource scrambling when multiple coroutines access shared memory.
Start Goroutine
To start a new Goroutine, just add the function callgo
Keywords. For example:
This line of code will start a new Goroutine to executemyFunction
。
Features of Goroutine
- Lightweight:Goroutine is lighter than traditional threads. Each Goroutine uses very little memory and starts faster.
- Scheduling: Goroutine is managed and scheduled by the Go runtime, not the operating system.
- Stack Management: Goroutine's stack grows dynamically, with an initial size generally small (such as 2KB), but can be dynamically expanded as needed, up to 1GB.
Synchronization and communication
In Go, synchronization and communication are usually implemented through channels. Channels are a type-safe communication mechanism provided by the Go language.
Create a channel
Can be usedmake
Function creation channel:
Send and receive
use<-
Operators can send and receive data:
// Send data to channelch <- 42 // Receive data from the channelvalue := <-ch
Channel with buffer
Create a buffered channel:
ch := make(chan int, 100)
This way the channel can buffer a certain amount of data without blocking the transmission of Goroutines.
Sample code
Here is an example of a simple Goroutine and channel:
package main import ( "fmt" "time" ) func worker(ch chan int) { for i := 0; i < 5; i++ { ch <- i () } close(ch) } func main() { ch := make(chan int) go worker(ch) for val := range ch { (val) } }
In this example,worker
Function to channelch
Send data, and thenmain
Function from channelch
Receive data and print it.
Goroutines and main program
It should be noted that if the main program exits, all unfinished Goroutines will also terminate immediately. Therefore, it is often necessary to ensure that the main program waits for all Goroutines to complete. For example, you can useTo achieve this:
package main import ( "fmt" "sync" ) func worker(wg *, id int) { defer () ("Worker %d starting\n", id) // Simulation work () ("Worker %d done\n", id) } func main() { var wg for i := 1; i <= 5; i++ { (1) go worker(&wg, i) } () ("All workers done") }
This example usesCome and wait for all the Goroutines to complete.
(1)
Used to increase the count,()
Reduce the count when Goroutine is completed,()
Then block until all Goroutines are completed.
Coroutines, threads, processes
Coroutines, threads and processes are the three main concepts in concurrent and parallel programming. They have different characteristics and applicable scenarios, and the following are their main differences:
Process
definition:
- A process is the basic unit of resource allocation in the operating system.
- Each process has its own memory space, file descriptors, and other resources.
Features:
- Isolation: Processes are independent of each other, and the crash of one process will not affect other processes.
- Large overhead: The overhead of switching between processes is high, and a large amount of context information needs to be saved and restored.
- Complex communication: Inter-process communication (IPC, such as pipelines, message queues, shared memory, etc.) is relatively complex.
Applicable scenarios:
- Suitable for tasks that require high isolation and independent operation.
- Suitable for concurrent processing between different programming languages and different platforms.
Thread
definition:
- A thread is an execution unit in a process and is part of the process.
- Threads in the same process share the process's memory and other resources.
Features:
- Lightweight: Compared with processes, thread creation and switching overhead is smaller.
- Share resources: Threads within the same process can directly access shared memory and resources, but this also brings synchronization problems.
- Concurrent execution: Multiple threads can be executed concurrently on multi-core CPUs.
Applicable scenarios:
- Suitable for tasks that require parallel processing, such as multi-threaded servers, parallel computing, etc.
- Suitable for scenarios where frequent switching and low overhead are required.
Coroutine
definition:
- Coroutines are user-state lightweight threads, also known as microthreads or fibers.
- Coroutines are managed and scheduled by the program itself, not the operating system.
Features:
- Lighter: The overhead of creating and switching coroutines is smaller because it does not involve kernel-state switching.
-
Collaborative scheduling: Coroutines use explicitly giving up operations (such as
yield
) to switch, control is controlled by the programmer. - Shared memory: Coroutines within the same thread can share memory, but synchronization issues need to be paid attention to.
Applicable scenarios:
- Suitable for I/O-intensive tasks such as high concurrency network servers.
- It is suitable for scenarios that require a large amount of concurrency but have low requirements for parallelism, such as crawlers, asynchronous programming, etc.
Summarize
- process: Good resource isolation and high overhead, suitable for tasks that run independently.
- Thread: Resource sharing, small overhead, suitable for tasks that require parallel processing.
- Coroutine: Lightweight, user-state scheduling, suitable for a large number of concurrent I/O-intensive tasks.
The respective choice mainly depends on the specific application scenario and performance requirements. Coroutines are becoming increasingly popular in modern programming, especially in scenarios where high concurrency and efficient I/O operations are required.
This is the end of this article about the implementation of the Goroutine coroutine in golang concurrent programming. For more related golang Goroutine coroutine content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!