协程本质上是单线程的吗?

Ign*_*ant 3 concurrency multithreading operating-system coroutine

根据维基百科,协程基于协作多任务处理,这使得它们比线程消耗更少的资源。没有上下文切换,没有阻塞,没有昂贵的系统调用,没有临界区等等。

换句话说,所有这些协程的好处似乎首先来自于禁止多线程。这使得协程本质上是单线程的:实现了并发,但没有真正的并行。

这是真的吗?是否可以使用多线程来实现协程?

Mat*_*ans 5

协程允许多任务处理而无需多线程,但它们并不禁止多线程。

在支持两者的语言中,处于睡眠状态的协程可以在不同的线程中重新唤醒。

CPU 密集型任务的通常安排是拥有一个线程数大约是 CPU 核心数两倍的线程池。然后,该线程池用于同时执行数千个协程。这些线程共享一个准备执行的协程队列,每当线程的当前协程阻塞时,它就会从队列中获取另一个协程来处理。

在这种情况下,您有足够的繁忙线程来保持 CPU 繁忙,并且仍然有线程上下文切换,但不足以浪费大量资源。协程上下文切换的次数要高出数千倍。