Home >Backend Development >Golang >How to use Go language for code asynchronous practice
How to use Go language for code asynchronous practice
With the rapid development of the Internet, the ability to cope with concurrent requests has become more and more important. During the development process, how to efficiently handle a large number of concurrent requests has become a key issue.
As a concurrent programming language, Go language provides powerful asynchronous programming capabilities through its efficient goroutine and channel mechanisms. In this article, we will explore how to use Go language for code asynchronous practice and demonstrate it through code examples.
The goroutine in the Go language is a lightweight thread. Starting a goroutine through the go keyword can achieve asynchronous code implement.
The following is a simple example that demonstrates how to use goroutine to implement asynchronous programming:
package main import ( "fmt" "time" ) func main() { fmt.Println("Start") go func() { for i := 0; i < 5; i++ { time.Sleep(1 * time.Second) fmt.Println("Async Task:", i) } }() time.Sleep(3 * time.Second) fmt.Println("End") }
In the above code, we add the go
keyword before the anonymous function to start a goroutine. This anonymous function will be called during asynchronous execution and output the execution results of the asynchronous task.
In common concurrency scenarios, we usually need to pass data from one goroutine to another goroutine. In order to achieve such asynchronous communication, the Go language provides a channel mechanism.
The following is an example that demonstrates how to use channels to implement asynchronous communication:
package main import ( "fmt" "time" ) func worker(id int, jobs <-chan int, results chan<- int) { for job := range jobs { // 模拟耗时的任务 time.Sleep(1 * time.Second) fmt.Println("Worker", id, "finished job", job) results <- job * 2 } } func main() { jobs := make(chan int, 5) results := make(chan int, 5) // 启动3个goroutine,用于并发处理任务 for i := 1; i <= 3; i++ { go worker(i, jobs, results) } // 添加5个任务到jobs channel for i := 1; i <= 5; i++ { jobs <- i } close(jobs) // 获取结果 for i := 1; i <= 5; i++ { result := <-results fmt.Println("Result:", result) } }
In the above code, we define a worker function to process tasks and send the results to results in channel. In the main function, we create a jobs channel for delivering tasks and a results channel for receiving results. Asynchronous communication is achieved by putting tasks into the jobs channel and then getting the results through the results channel.
Sometimes we need to wait for all asynchronous tasks to complete before proceeding to the next step. To achieve this, you can wait using sync.WaitGroup
.
The following is an example that demonstrates how to use sync.WaitGroup
to wait for an asynchronous task to complete:
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() time.Sleep(1 * time.Second) fmt.Println("Worker", id, "finished") } func main() { var wg sync.WaitGroup for i := 1; i <= 3; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("All workers finished") }
In the above code, we pass ## before the worker function call #wg.Add(1)Increments a count, and then decreases a count by
wg.Done() after the worker function is executed. Through
wg.Wait(), wait until all goroutine executions are completed before continuing.
The above is the detailed content of How to use Go language for code asynchronous practice. For more information, please follow other related articles on the PHP Chinese website!