BeautyyuYanli / gitalk-for-blog

gitalk-for-blog
0 stars 0 forks source link

再谈:线程和进程 #48

Open BeautyyuYanli opened 1 year ago

BeautyyuYanli commented 1 year ago

https://blog.beautyyu.one/re-thread-and-process

这是个老生常谈的问题,但我希望能讲得更明白一些。

zreren commented 1 year ago

非常通俗易懂的讲解

RZYN2020 commented 1 year ago

博主写的很好!不过感觉还有一点需要补充一下——“协程和线程”的区别。

“协程与线程的概念是很紧密的,它就是不能并行的多线程。”这句话似乎不是很准确。

通常情况下协程“coroutine”应该是指 cooperative multitasking (协作式多任务)的实现,而所谓线程就一般指的是 preemptive multitasking (抢占式多任务)的实现了。两种并发模型都为我们提供了独立执行流的抽象,但他们所提供抽象的不同之处在于“如何进行任务间的切换”。

单个CPU时,抢占式多任务中任务切换是由相应硬件机制强行终止一个任务再换上另一个任务来实现的;而协作式多任务中是任务自己通过yield,await等特殊操作来主动交出CPU控制权的。

抢占式多任务很容易扩展到多CPU上,因此也能很好得利用并行能力了;但协作式多任务由于只提供了主动交出控制权这样的并发模型,所以也就难以利用多CPU的并行能力了;

那么由上面所说的 “线程->抢占式->并行,“协程->协作式->无法并行” 两个关系来看,难道“多协程是不能并行的多线程”也对?但是!线程的定义中并没有强调“并行”,因此也有不能并行的线程模型!比如由于CPython臭名昭著的GIL(Global Interpreter Lock),每个解释器线程进入指令分派循环时都需要获取这把锁,因此CPython提供的并发模型就是“线程->抢占式->无法并行,“协程->协作式->无法并行”了,,

当然这些话有些咬文嚼字之嫌,,,毕竟这些概念本来也就不是well-defined的。不过“协作”“抢占”两个概念以及“CPython”的实现这些东西我感觉还是挺有意思的。