关于julia协程有一点我不懂

julia语言程序设计中说julia协程是多任务协作机制,而不是抢占式多任务机制
这是什么意思?难道与原子变量的CAS机制类似吗,实在不懂,请指点一二:thinking:

抢占式多任务(preemptive multitasking)。抢占式的由操作系统分配每个线程的运行时间,线程自己没有决定权,线程自己可能运行到一半被打断。

协作式多任务(cooperative multitasking)。协程由由任务自己决定什么时候交出 CPU,让其他任务运行。

Preemptive: thread do not decide when to run and are forced to share the CPU

Cooperative: each thread, once running decides for how long to keep the CPU, and when it gives it up so another thread can use it.

—— operating system - What is the difference between cooperative multitasking and preemptive multitasking? - Stack Overflow


可以找一些你熟悉的其他语言的协程例子看一看。zhihu 上说 lua 的例子好

如前面所见,Lua 中的协程是——协作的多线程,每一个协程等同于一个线程,yield-resume 可以实现在线程中切换。然而与真正的多线程不同的是,协程是非抢占式的。当一个协程正在运行时,不能在外部终止他。只能通过显示的调用 yield 挂起他的执行。对于某些应用来说这个不存在问题,但有些应用对此是不能忍受的。不存在抢占式调用的程序是容易编写的。不需要考虑同步带来的 bugs,因为程序中的所有线程间的同步都是显示的。你仅仅需要在协程代码超出临界区时调用 yield 即可。

对非抢占式多线程来说,不管什么时候只要有一个线程调用一个阻塞操作(blocking operation),整个程序在阻塞操作完成之前都将停止。对大部分应用程序而言,这是无法忍受的,这使得很多程序员离协程而去。

—— Programming in Lua \ 9.4 非抢占式多线程

Julia 这边有类似的 yieldto 不过一般不直接调用, 而是用 put!take!流程控制 · Julia中文文档

其他的一些讨论:

那么我可以把协程看作同步非阻塞吗

同步阻塞吧(存疑?)。 put!take! 都是阻塞操作。

看到有文章说 “ 协程是异步非阻塞的另外一种展现形式。”

这么说的话julia协程是不能称作多线程的吗

另外怎么控制协程阻塞

协程本来就和多线程不同,算是更轻量的线程,实际上就一个线程在跑,切换任务代价也更小。用协程就写起来方便,也不用关心锁的问题。

julia 的文档里协程和多线程也是分开的。

为什么协程不能从外部终止呢?