golang协程的定义和使用1

进程
  1. **定义:**是一个正在运行的程序实例。每一个进程都拥有独立的内存空间、文件系统资源和系统状态。
  2. 特性:
    • 进程之间是独立的,一个进程崩溃不会影响其他进程。
    • 进程有自己的地址空间,批次之间不能直接访问对方内存。
    • 进程之间的通信成本比较高。
  3. **创建和销毁:**进程的创建通常涉及复制父进程的资源,包括代码块,数据段等。进程的销毁是通过系统的调用来终止进程的。
  4. **示例:**spring boot应用程序、浏览器、文本编辑器。
线程
  1. **定义:**线程市在进程内部独立运行的基本执行单元。一个进程可以包含多个线程,他们共享进程资源。
  2. 特性:
    • 线程之间共享相同的地址空间,可以直接访问进程的内存。
    • 线程之间的通信较为简单,可以通过共享内存来实现。
    • 一个进程中的线程崩溃可能会影响到其他线程,因为他们共享相同的资源。
  3. **创建和销毁:**线程的创建较为轻量,通常只需要复制一些资源。线程的销毁是通过系统调用来结束线程。
  4. **示例:**在一个文本编辑器中,不同的线程可以负责用户输入、屏幕绘制等任务。
协程
  1. **定义:**协程是一种轻量级、用户空间的并发执行单元。协程通常在同一线程内并发执行,且共享相同的地址空间。
  2. 特性:
    • 轻量级,协程的创建和销毁的成本相对比较低,在用户空间内运行,无需涉及完整的线程上下文切换。
    • 用户空间调度,协程的调度是由用户或编程语言运行时环境进行管理,使得协程的调度和切换更加灵活。
    • 共享空间地址, 多个协程通常在同一线程内并发执行,它们共享相同的地址空间,可以直接访问相同的数据。
协程示例
package main

import (
	"fmt"
	"time"
)

func exampleCoroutine() {
	fmt.Println("Start Coroutine")
	time.Sleep(time.Second)
	fmt.Println("End Coroutine")
}

func main() {
	// 创建协程
	go exampleCoroutine()
	// 主线程继续执行其他任务
	fmt.Println("Main Thread is working")
	// 等待一段时间,以确保协程有足够的时间执行
	time.Sleep(time.Second * 2)
	fmt.Println("Main Thread End")
}

执行的结果为:

Main Thread is working
Start Coroutine
End Coroutine
Main Thread End
启动多个协程

sync 包提供了一些用于同步的工具,如 sync.WaitGroupsync.WaitGroup 用于等待一组协程(Goroutine) 完成执行

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func hello(i int) {
	// goroutine结束就登记-1
	defer wg.Done()
	fmt.Println("Hello Goroutine!", i)
}
func main() {

	for i := 0; i < 10; i++ {
		// 启动一个goroutine就登记+1
		wg.Add(1)
		go hello(i)
	}
	// 等待所有登记的goroutine都结束
	wg.Wait()
}
启动多个协程,保护公共变量

sync 中的 sync.Mutex用于保护共享资源

package main

import (
	"fmt"
	"sync"
)

var (
	count int
	wg    sync.WaitGroup
	mutex sync.Mutex
)

func main() {
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go incrementCounter()
	}
	wg.Wait()
	fmt.Println("Final Counter: ", count)
}

func incrementCounter() {
	defer wg.Done()

	// 对公共资源上锁
	mutex.Lock()
	count++
	// 操作完毕,对公共资源解锁
	mutex.Unlock()
}

tips: 使用体验上,协程比线程简单便捷,Java的自定义线程还要写单独的配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值