goroutine 的协程有什么特点,和线程相比?

4 min read

goroutine 有以下特点:

  1. 轻量级:goroutine 很轻巧,可以同时运行成千上万个而不会消耗过多的内存。

  2. 极低的切换代价:goroutine 可以在用户态进行切换,和线程相比,切换代价极低,因为不需要进行内核态与用户态的切换。

  3. 互相通讯:goroutine 可以通过 channel 进行通信,可以实现线程之间的互相协调、同步和通讯。

  4. 自动垃圾回收:goroutine 的内存分配和回收都由 Go 运行时自动管理,减轻了开发者的负担。

  5. 可执行挂起:goroutine 的挂起不需要像线程那样必须等待下一个时间片才能被恢复执行,而是在遇到一个阻塞操作时,会在相应的阻塞模式下被挂起。可以看做是一个对多个协程进行调度和关联的线程,是一种更加高级的抽象。

相比线程,goroutine 更加轻量级、效率更高。同时,由于 Go 语言在语法层面上提供了 go 关键字,可以方便地创建 goroutine,而线程需要进行操作系统层面的操作,因此使用 goroutine 可以简化开发流程,同时更易于管理。此外,线程调度是由操作系统负责,不能自行优化,而 goroutine 的调度是基于 Go 运行时系统实现的,因此在并发量较高时,可以通过合理的设计和调整,提高程序的性能。