【go的源码阅读】context的实现:context.go

理解Context 这篇文章介绍的很清楚:深入理解Go Context 这个比较详细,但是层次不好:理解GO CONTEXT机制 关于context的使用场景 context的主要使用场景在于:一个任务在处理的过程中可能会启动很多个协程来进行处理。在这个过程中,如果上游的任务想要取消,下游的任务也应当一起取消。context的任务就来了。 内容介绍 context包的内容可以概括为:1个接口,4个实现,6个方法 接口 context.Context 一个接口是指:context.Context type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} } Deadline( ) Deadline会返回一个超时时间,Goroutine获得了超时时间后,例如可以对某些io操作设定超时时间。 函数签名 Deadline() (deadline time.Time, ok bool) Deadline 返回的时间 deadline time.Time 代表这个ctx应该被取消的时间。返回的 ok 如果是 false 表示这个context没有设置deadline。连续调用 Deadline 会返回相同的结果。 // Deadline returns the time when work done on behalf of this context // should be canceled. Deadline returns ok==false when no deadline is // set....

July 26, 2024 · 14 min · 2785 words · sirius1y

【go的源码阅读】channel的实现:chan.go

channel的简单使用 在Go语言中,通道(channel)是一种用于在goroutine之间进行通信和同步的机制。下面是一些简单的通道使用示例,以及它们对应的底层函数调用。 package main import ( "fmt" "time" ) func main() { ch := make(chan int) // 创建通道 go func() { ch <- 42 // 发送数据到通道 }() go func() { value := <-ch // 从通道接收数据 fmt.Println("Received:", value) }() time.Sleep(1 * time.Second) // 等待goroutine完成 close(ch) // 关闭通道 } 底层函数调用 创建通道: ch := make(chan int) 底层调用: makechan(elemtype, size) 发送数据到通道: ch <- 42 底层调用: chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool 从通道接收数据:...

May 10, 2024 · 20 min · 4092 words · sirius1y