Golang 之协程的用法讲解

Golang 之协程的用法讲解

什么是协程

协程(Coroutines),也称为轻量级线程(Light Weight Thread),是一种用户态线程,不依赖于操作系统内核,由程序自己实现调度,可以在一条线程中运行多个协程,协程之间可以独立运行,也可以通过通道(Channel)进行通信和同步。协程通常用于实现事件驱动、异步编程、并发计算等技术领域。

协程的用法

在 Golang 中,协程的创建非常简单,只需要使用关键字 go,将一个函数调用前缀即可。例如:

go func() {
    // 协程要执行的代码
}()

上述代码定义了一个匿名函数,并放置在一个新的协程中执行。

除了匿名函数,我们也可以使用普通的函数。例如:

func worker() {
    // 协程要执行的代码
}

go worker()

协程创建后,程序不会等待协程执行完毕,而是继续执行主流程,所以协程创建后可以与主流程并行执行。

协程在执行过程中,可以通过 time.Sleep() 或者 select 等方式等待一段时间,也可以通过 sync.WaitGroup 等方式等待协程全部执行完毕。

示例一:使用协程实现并发计数器

package main

import (
    "fmt"
    "sync"
)

func main() {
    var count int
    var lock sync.Mutex

    for i := 0; i < 10000; i++ {
        go func() {
            lock.Lock()
            count++
            lock.Unlock()
        }()
    }

    // 确保所有协程执行完毕
    for count < 10000 {
        // do nothing
    }

    fmt.Println(count)
}

上述代码定义了一个计数器变量 count,并使用 sync.Mutex 做为锁,保证对 count 的并发访问是安全的。

在一个循环中启动了 10000 个协程,每个协程都对 count 进行加一操作,在加一操作前使用锁进行了同步,从而保证了并发安全。

最后使用一个循环等待所有协程执行完毕,然后输出计数器的值。

示例二:使用协程实现并发送邮件

package main

import (
    "fmt"
    "net/smtp"
)

func main() {
    var to = []string{"user1@example.com", "user2@example.com", "user3@example.com"}

    for _, addr := range to {
        go func(addr string) {
            sendMail(addr, "Subject", "Content")
        }(addr)
    }

    // 等待所有协程执行完毕
    fmt.Println("Sending mails...")
}

func sendMail(to, subject, body string) error {
    from := "sender@example.com"
    auth := smtp.PlainAuth("", from, "password", "smtp.example.com")

    msg := "From: " + from + "\n" +
        "To: " + to + "\n" +
        "Subject: " + subject + "\n\n" +
        body

    err := smtp.SendMail("smtp.example.com:25", auth, from, []string{to}, []byte(msg))
    if err != nil {
        fmt.Println(err)
        return err
    }

    fmt.Println("Mail sent to", to)
    return nil
}

上述代码定义了一个接收地址列表 to,并在循环中启动了多个协程,每个协程使用 sendMail 函数向一个地址发送邮件。

sendMail 函数中,使用 smtp.PlainAuth 构造了一个 smtp.Auth 实例,用于进行 SMTP 认证。

接下来,构造了邮件的内容 msg,并使用 smtp.SendMail 函数发送邮件。

在协程完成邮件发送后,输出提示信息。

总结

协程是 Golang 中非常强大的并发编程模型。使用协程可以轻松地实现事件驱动、异步编程、并发计算等技术领域的需求。在使用协程时,需要注意协程间的同步和数据共享问题,可以使用锁、通道、等待组等技术保证并发安全。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Golang 之协程的用法讲解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 如何在HTML 中嵌入 PHP 代码

    在HTML中嵌入PHP代码是一种常见的Web开发技术,通过PHP的强大功能,可以实现对网站进行动态操作和响应。下面是如何在HTML中嵌入PHP代码的完整攻略: 步骤1:创建PHP文件 首先,我们需要创建一个具有.php扩展名的文件,此文件将包含我们的HTML和PHP代码。 <!DOCTYPE html> <html> <head…

    PHP 2023年5月24日
    00
  • [原创]php中&&和||逻辑运算符的高级简写(缩写条件)用法由浅入深讲解

    当前回答已经使用了标准的Markdown格式文本,但可能由于技术问题导致格式出现了问题。以下是重新排版后的回答: 基础知识 在使用PHP中的逻辑运算符时,需要掌握一些基础知识,包括逻辑运算符的基本用法、逻辑运算符的优先级、逻辑运算符的短路特性等。以下是一些常见的基础知识: 逻辑运算符的基本用法,包括&&、||、!等。 逻辑运算符的优先级,包括…

    PHP 2023年5月12日
    00
  • php URL编码解码函数代码

    接下来我将为你提供一份详细的 “PHP URL编码解码函数代码” 攻略: 1. 什么是PHP URL编码解码? 如果你从事 PHP Web 开发,你可能会经常遇到 URL 中出现特殊字符的情况。这时,我们需要对 URL 进行编码,以便确保 URL 可以正确传输。 URL 编码是将文本数据转换为一种格式,以便浏览器可以将其传送到 Web 服务器上。PHP 中提…

    PHP 2023年5月23日
    00
  • php中str_pad()函数用法分析

    PHP中str_pad()函数用法分析 简介 str_pad()是PHP中一个字符串处理函数,用于在字符串的左侧或右侧填充指定字符,使字符串达到指定的长度。 函数原型 str_pad(string $input, int $pad_length, string $pad_string = " ", int $pad_type = STR_…

    PHP 2023年5月26日
    00
  • php实现简单爬虫的开发

    首先我们需要了解什么是爬虫。爬虫是一种网络爬虫程序,用于在互联网上自动抓取信息。一般来说,爬虫工作流程如下:首先确定要爬取哪些数据,然后连接目标网站,从目标网站上爬取相关信息,最后对爬取到的数据进行处理和分析,最终存储下来。 下面我们来讲解如何使用 PHP 编写一个简单的爬虫。 第一步:引入phpQuery类库 phpQuery是一个基于 PHP 的 DOM…

    PHP 2023年5月27日
    00
  • PHP 超链接 抓取实现代码

    你好,关于 PHP 超链接抓取实现代码这一话题,以下是一份标准的攻略文档供您参考。 PHP 超链接抓取实现代码攻略 什么是超链接抓取? 超链接抓取是指从互联网上获取超链接地址链接的过程。 超链接抓取实现代码示例 以下是一个使用 PHP 实现超链接抓取的示例: $url = "http://example.com"; $html = fil…

    PHP 2023年5月23日
    00
  • wamp下修改mysql访问密码的解决方法

    下面是详细讲解“wamp下修改mysql访问密码的解决方法”的完整攻略: 问题描述 在WAMP环境下使用MySQL时,我们可能需要修改MySQL访问密码。但是,部分人员不知道具体的修改方法,出现以下问题: 如何修改mysql访问密码? 如何在WAMP环境下重置MySQL的root密码? 如果出现忘记MySQL的密码或无法登录的问题该怎么办? 接下来,我们将介…

    PHP 2023年5月23日
    00
  • php获取’/’传参的值简单方法

    PHP获取URL参数是非常常见的操作,对于参数的获取,不仅限于通过?符号传参。有时候也需要通过 / 路径传参,例如 /article/123。 下面是通过 PHP 获取 / 传参的方法: 首先,通过 $_SERVER[‘REQUEST_URI’] 获取完整 URL,然后使用 explode() 或 preg_split() 函数按照 / 将 URL 拆分为数…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部