3 回答
TA贡献1772条经验 获得超6个赞
从第3天教程引述<-阅读此内容以获取更多信息。
Goroutines根据需要多路复用到系统线程上。当goroutine执行阻塞系统调用时,不会阻塞其他goroutine。
在某些时候,我们将对与CPU绑定的goroutine进行相同的操作,但是现在,如果要使用用户级并行性,则必须设置$ GOMAXPROCS。或致电runtime.GOMAXPROCS(n)。
goroutine不一定与OS线程相对应。它可以具有较小的初始堆栈大小,并且堆栈将根据需要增长。
需要时,可以将多个gorouitines复用到单个线程中。
更重要的是,该概念如上所述,goroutine是一个顺序程序,可能会阻塞自身,但不会阻塞其他goroutine。
Goroutines在gccgo中作为pthreads实现,因此它也可以与OS线程相同。它将OS线程的概念与我们在编程时对多线程的思想分开。
TA贡献1825条经验 获得超4个赞
在参考编译器(5g / 6g / 8g)中,主调度程序(src / pkg / runtime / proc.c)创建N个OS线程,其中N由runtime.GOMAXPROCS(n)(默认值为1)控制。每个调度程序线程都会从主列表中拉出一个新的goroutine并开始运行它。goroutine将继续运行,直到进行系统调用(例如printf)或在通道上进行操作为止,此时调度程序将获取下一个goroutine并从其停止的那一点开始运行它(请参阅gosched()调用src / pkg / runtime / chan.c)。
出于所有目的和目的,调度是使用协程实现的。可以使用setjmp()和longjmp()在C语言中编写相同的功能,Go(以及其他实现轻量级/绿色线程的语言)只是为您实现了自动化。
轻量级线程的好处在于,因为它是所有用户空间,因此创建“线程”非常便宜(分配小的默认堆栈),并且由于线程之间相互通信的固有结构而非常高效。缺点是它们不是真正的线程,这意味着单个轻量级线程可以阻止整个程序,即使看起来所有线程都应同时运行。
- 3 回答
- 0 关注
- 295 浏览
添加回答
举报