func main() {
for i := 0; i < 1000; i++ {
go func(i int) {
for {
fmt.Printf("Hello from"+"goroutine %d\n", i)
}
}(i)
}
time.Sleep(time.Millisecond)
}
协程Coroutine
1 轻量级"线程",
2 非抢占式多任务处理,由协程主动交出控制权
3 编译器/解释器/虚拟机层面的多任务
4 多个协程可能在一个或多个线程上运行
任何函数只需要加上go就能送给调度器运行
不需要再定义时区分是否是异步函数
调度器在合适的点进行切换,开发人员仅能控制部分
使用-race来检测数据冲突
goroutine可能的切换点
1 I/O,select
2 Channel
3 等待锁
4 函数调用(有时)
5 runtime.Gosched()
6 只是参考,不能保证切换,不能保证在其他地方不切换
本文深入探讨Go语言中的协程(goroutine)概念,阐述其作为轻量级线程的特性,如非抢占式多任务处理和编译器层面的调度。通过示例代码展示了如何创建和控制协程,强调了I/O、select、Channel等协程切换点,并提到了数据竞争检测工具 `-race` 的使用。
4300

被折叠的 条评论
为什么被折叠?



