Concurrency 什么是合作项目?

Concurrency 什么是合作项目?,concurrency,language-agnostic,terminology,coroutine,Concurrency,Language Agnostic,Terminology,Coroutine,什么是合作项目?它们与并发有什么关系?协同路由和并发在很大程度上是正交的。协程是一种通用的控制结构,其中流控制在两个不同的例程之间协同传递,而不返回 Python中的“yield”语句就是一个很好的例子。它创建了一个协同程序。当遇到“yield”时,将保存函数的当前状态,并将控制权返回给调用函数。然后,调用函数可以将执行转移回屈服函数,其状态将恢复到遇到“屈服”的点,执行将继续。来自,“协同程序””部分: 协同程序类似于线程(在多线程的意义上):它是一个执行行,有自己的堆栈、自己的局部变量和自己

什么是合作项目?它们与并发有什么关系?

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

Python中的“yield”语句就是一个很好的例子。它创建了一个协同程序。当遇到“yield”时,将保存函数的当前状态,并将控制权返回给调用函数。然后,调用函数可以将执行转移回屈服函数,其状态将恢复到遇到“屈服”的点,执行将继续。

来自,“
协同程序”
”部分:

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

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

对于“
并发性”
”,您可以参考Rob Pike的:

并发是由独立执行的计算组成的


因此,在协程A的执行过程中,它将控制权传递给协程B。然后,一段时间后,协程B将控制权传递回协程A。由于协程之间存在依赖关系,并且它们必须串联运行,因此这两个协程是而不是并发的协程类似于子例程/线程。 不同之处在于,一旦调用方调用了子例程/线程,它将永远不会返回调用方函数。 但是协同路由可以在执行几段代码后返回给调用方,允许调用方执行自己的一些代码,并返回到协同路由点,在那里停止执行并继续执行。 即,一个协同程序在不同的注释上有多个入口和出口点, 在python中,gevent库是一个基于
协同路由
的网络库,它为您提供了异步网络请求之类的线程特性,而无需创建和销毁线程的开销。使用的
coroutine
库是
greenlet

  • 协同程序是Kotlin语言中可用的强大功能
  • 协同路由是一种新的异步、无阻塞的编写方法 代码(以及更多)
  • 协同程序是轻量级线程。轻量的线意味着它 不映射到本机线程,因此不需要切换上下文 在处理器上,因此速度更快
  • 它不映射到本机线程
  • 协同程序和线程都是多任务的。但区别是什么 线程由操作系统管理,协同路由由用户管理
基本上,共程有两种类型:

  • 无堆栈
  • 堆积如山
  • Kotlin实现了无堆栈协同路由 — 这意味着 协同路由没有自己的堆栈,因此它们不映射到本机线程

    以下是启动协同程序的函数:

    launch{}
    
    async{}
    
    您可以从这里了解更多信息:


    我发现大多数答案都过于技术性,尽管这是一个技术性问题。我很难理解协同程序。我有点明白了,但我不能同时明白

    我发现这个答案非常有用:

    引用伊丹·雅莉的话:

    根据你的故事,我会这样说:

    你开始看动画片,但它是介绍。而不是 观看开场白后,你切换到游戏并进入在线大厅- 但它需要3名球员,只有你和你姐姐在里面。相反 等待另一个玩家加入你,切换到你的家庭作业,以及 回答第一个问题。第二个问题有一个到YouTube的链接 你需要看的视频。你打开它,它开始加载。相反 等待它加载,你切换回卡通。介绍 结束了,你可以看了。现在有了商业广告,但同时也有 第三个玩家已经加入,所以你可以切换到游戏,等等

    这个想法是,你不只是切换任务真的很快作出 看起来你正在同时做每件事。你利用时间 你正在等待一些事情发生(IO)去做其他可以做的事情 需要你的直接关注

    一定要查看链接,还有更多内容我无法全部引用。

    来自:

    Python协程的执行可以在许多时候暂停和恢复 点(参见协同程序)。在协程函数的主体内,等待 异步标识符成为保留关键字;等待表达, async for和async with只能在协同路由函数中使用 尸体

    协同程序是一种可以暂停执行以恢复的函数 以后。协同路由是无堆栈的:它们通过返回 给打电话的人。这允许执行顺序代码 异步(例如,在没有显式 回调),并且还支持惰性计算无限的算法 序列和其他用途

    与他人的答案进行比较:

    在我看来,稍后恢复的部分是
    When a coroutine begins execution  
    When a coroutine reaches a suspension point  
    When a coroutine reaches the co_return statement  
    If the coroutine ends with an uncaught exception  
    When the coroutine state is destroyed either because it terminated via co_return or uncaught exception, or because it was destroyed via its handle 
    
    suspend fun downloadFile(): File {
        //logic
    }
    
    suspend fun saveFile(file: File) {
        //logic
    }
    
    GlobalScope.launch {
        val downloadResult = downloadFile() //suspend function
        show(downloadResult) //UI 
        saveFile(downloadResult) //suspend function
    }
    
    class Continuation {
        File file;
     
        void invokeSuspend(Object result) {
            switch (label) {
                case 0: {
                    label = 1;
                    downloadFile(this); //suspend function
                    return;
                }
                case 1: {
                    file = (File) result;
                    show(file); //UI
                    saveFile(file, this); //suspend function
                    return;
                }
            }
        }
    }