2009-02-16 57 views
97

什么是协同程序?它们与并发有什么关系?什么是协同程序?

+0

并行代码不必一定要运行“并行”(我们不要介绍新术语)。 – user1712447 2018-01-30 20:35:46

+0

我已经用标准C编写了一个协程库,支持Linux,BSD和Windows的select/poll/eplll/kqueue/iocp/Win GUI消息。这是一个https://github.com/acl-dev/libfiber中的开源项目。建议将是很好的。 – 2018-02-24 15:38:47

回答

80

协程和并发在很大程度上是正交的。协程是一种通用的控制结构,流量控制在两个不同的例程之间协同传递而不返回。

Python中的'yield'语句就是一个很好的例子。它创建了一个协程。当遇到'yield'时,函数的当前状态被保存并且控制返回到调用函数。调用函数然后可以将执行传回给yield函数,并且它的状态将被恢复到遇到'yield'并且执行将继续的点。

+9

直接调用一个函数和从一个协程产生并将此函数包装到这个协程中有什么区别? – 2014-08-04 10:44:00

29

Programming in LuaCoroutines”部分:

甲协程类似于线程(在多线程的有义):它是在执行的线,具有它自己的堆栈,其自己的局部变量,和它自己的指令指针;但它与其他协同程序共享全局变量和大部分其他内容。线程和协程之间的主要区别在于,在概念上(或者在字面上,在多处理器机器中),具有线程的程序并行地运行多个线程。另一方面,协程是协作性的:在任何特定时间,一个带有协程的程序只运行一个协程,并且这个正在运行的协程只有在明确请求暂停时才暂停执行。

所以问题是:协程是“协作”的。即使在多核系统中,在任何给定时间只有一个协程运行(但多个线程可以并行运行)。在协程之间是非抢先的,运行的协程必须明确放弃执行。

对于 “concurrency”,可以参考罗布派克的slide

并发是独立地执行的计算的组合物。

所以在协程A的执行,它通过控制一段时间后,再到协程B.,协程B通过控制回协程A.既然有协同程序之间的依赖,他们必须同时运行,所以这两个协程是不是并发

6

协程类似于子程序/线程。 区别在于一旦调用者调用子程序/线程,它将永远不会返回到调用者函数。 但是一个协程可以在执行一段代码后返回给调用者,允许调用者执行一些自己的代码并返回到协程终点,并停止执行并从那里继续执行。 即。一个协同程序有多个入口点和出口点

1

在不同的音符, 在python gevent库是基于coroutine网络库,让你线状的功能,比如异步网络请求,而无需创建和销毁线程的开销。使用的库为greenlet

0
  • 协程在科特林语言
  • 协同程序提供强大的功能正在编写异步非阻塞 代码(以及更多)
  • 协程是轻量线程的新途径。重量轻的线程意味着它不在本地线程上映射,因此它不需要处理器上的上下文切换 ,因此它们更快。
  • 它不映射在本地线程上
  • 协程和线程都是多任务处理。但差异 是线程由用户管理的OS和协程。

基本上有两种类型的协同程序:

  1. 无堆栈
  2. Stackful

科特林实现了无堆叠的协同程序 - 它意味着 协程没有自己的堆栈,所以它们不会在本地线程上映射。

这些都是启动协程的功能:

launch{} 

async{} 

您可以了解更多从这里:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9