发布时间:2024-12-23 00:40:07
携程是通过go关键字启动的。在下面的示例中,我们将使用携程并发地执行两个函数。
```go func main() { go func1() go func2() time.Sleep(time.Second) // 暂停main函数,以确保所有携程执行完毕 } func func1() { // TODO: 执行一些操作 } func func2() { // TODO: 执行一些操作 } ``` 在上述示例中,我们使用了`go`关键字启动了两个携程,并发地执行`func1`和`func2`函数。为了确保main函数等待所有携程执行完毕,我们使用了`time.Sleep(time.Second)`语句暂停程序的执行。通道可以通过`make`函数创建,并使用`<-`操作符进行读写操作。下面的示例演示了如何创建并使用一个通道。
```go func main() { ch := make(chan int) // 创建一个int类型的通道 go func1(ch) go func2(ch) result1 := <-ch // 从通道中读取数据 result2 := <-ch fmt.Println(result1, result2) } func func1(ch chan<- int) { // TODO: 执行一些操作,将结果发送到通道中 ch <- 42 // 将42发送到通道中 } func func2(ch chan<- int) { // TODO: 执行一些操作,将结果发送到通道中 ch <- 88 // 将88发送到通道中 } ``` 在上述示例中,我们首先使用`make`函数创建了一个整数类型的通道`ch`。然后,我们创建了两个携程,并将通道作为参数传递给这些携程。`func1`和`func2`函数执行一些操作,并将结果发送到通道中。在主函数中,我们使用`<-`操作符从通道中读取数据,并将结果打印出来。携程池可以使用`sync`包中的`WaitGroup`和`Pool`类型来实现。下面的示例演示了如何创建一个包含多个携程的携程池。
```go func main() { var wg sync.WaitGroup numWorkers := 10 // 携程数量 wg.Add(numWorkers) for i := 0; i < numWorkers; i++ { go func() { defer wg.Done() // TODO: 执行一些操作 }() } wg.Wait() // 等待所有携程执行完毕 } ``` 在上述示例中,我们首先创建了一个`WaitGroup`实例`wg`,用于等待所有携程执行完毕。然后,我们使用一个循环创建了指定数量的携程,并在每个携程中执行一些操作。在每个携程执行完毕时,我们调用`wg.Done()`方法通知`WaitGroup`实例。最后,我们使用`wg.Wait()`方法等待所有携程执行完毕。错误组可以使用`golang.org/x/sync/errgroup`包中的`errgroup.Group`类型来实现。下面的示例演示了如何使用错误组。
```go func main() { var eg errgroup.Group eg.Go(func() error { // TODO: 执行一些操作 return nil }) eg.Go(func() error { // TODO: 执行一些操作 return errors.New("some error") }) if err := eg.Wait(); err != nil { fmt.Println("One or more goroutines returned an error:", err) } } ``` 在上述示例中,我们首先创建了一个`errgroup.Group`实例`eg`。然后,我们使用`Go`方法将多个函数添加到错误组中。这些函数在执行过程中可能返回错误。最后,我们使用`Wait`方法等待所有携程执行完毕,并检查是否有错误发生。
参考资料:
- [Effective Go - Concurrency](https://golang.org/doc/effective_go#concurrency)
- [The Go Blog - Share Memory By Communicating](https://blog.golang.org/share-memory-by-communicating)