跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • [求教] 协程与 IO 多路复用区别?
未分類
21 7 月 2020

[求教] 协程与 IO 多路复用区别?

[求教] 协程与 IO 多路复用区别?

資深大佬 : kaiser1992 7

网上搜索 python asyncio 包的介绍,清一色都涉及到了 IO 多路复用( EventLoop ),非阻塞确实能够提升性能,但是和协程有啥关系呢~?

我的疑惑是 python 的原生协程是基于生成器增强来实现的,怎么与 IO 多路复用关联到一块呢?

大佬有話說 (11)

  • 資深大佬 : reus

    建议不要理会也不要使用“多路复用”、“非阻塞”、“协程”这些词,因为不同人会有不同的理解,而且没法达成一致。

  • 資深大佬 : ruanimal

    协程只是让 eventloop 写起来更方便,不然你得写回调。

    eventloop 必须非阻塞的 fd 加多路复用

  • 資深大佬 : chevalier

    都学过操作系统,操作系统的功能之一就是提供硬件的访问接口,例如:网络 IO

    协程是“用户态”的概念,IO 多路复用是系统调用的接口,是“用户态”与“内核态”交互的方式;毕竟协程是无法直接访问网卡缓冲区的,需要调用系统接口来获取网络 IO 的数据。

    所以网络程序,协程一般需要搭配 IO 多路复用才能发挥最大威力,协程提升并发处理的能力,网络 IO 能力就要靠 IO 多路复用。

    说得比较简单,细说了能写好几篇文章了。建议看看 tornado/asyncio 的源码,网络通信模块,或者自己用 C 写一写 epoll 系统调用,就容易理解了。

  • 資深大佬 : coldmonkeybit

    借请教,没用过 Python,请问 python 中的协程跟 go 的协程类似么?

  • 主 資深大佬 : kaiser1992

    @chevalier 所以说,如果我的程序一点没有 IO,协程执行过程中就不会用到多路复用的机制了吧~?

  • 資深大佬 : palfortime

    协程和 io 多路复用是两个维度的东西,协程只要有 io 就可以派上用途,线程也可以搭配 io 多路复用。

  • 資深大佬 : guochao

    > 如果我的程序一点没有 IO,协程执行过程中就不会用到多路复用的机制了吧~?

    对,如果一个程序没有 IO 和其他暂停线程的手段,也就是说是《计算密集型》的程序,那么就和多路复用无关,毕竟这是个 IO 概念。

    协程的本质是利用多路复用和信号尽可能多的《在同一个线程上跑更多的任务》,IO 和休眠的时候协程就会暂停,遇到信号就会唤醒。无非就是把以前的回调换了一种形式,让回调变成顺序的过程,更适合人类理解。

    《 IO 密集型》的程序利用协程可以获取《更高的并发度(同一个线程上可以跑更多的 IO 任务)》,但是也会带来《更高的延迟(唤醒和调度的开销)》。计算密集型的程序几乎不会有任何提升。

  • 資深大佬 : dongcidaci

    斗胆说一下,协程就是用户态的线程,上下文切换开销小。多路复用是一种 IO 方式。貌似没什么关系。

  • 資深大佬 : ysc3839

    推荐看一下这篇文章 https://blog.panicsoftware.com/coroutines-introduction/

    我个人的理解,无栈协程是一种可以中途返回,后面再从之前返回的地方恢复执行的函数。利用这种特性可以实现许多功能,比如生成器,求出一个值之后返回,需要下一个值的时候再恢复执行。或者用来编写异步 IO 代码,在开始 IO 操作后返回,IO 操作完成之后恢复执行。
    而异步 IO 又有多种实现方式。可以用最简单的多线程来实现,协程启动一个新线程来进行阻塞 IO 操作,同时返回,新线程中的 IO 操作完成后,在新线程中恢复执行协程。
    也可以用单线程来实现,但是要配合 IO 多路复用来实现,IO 多路复用简单说是同时监视多个文件描述符是否就绪,协程在当前线程进行非阻塞的 IO 操作之后返回,然后当前线程会检测文件描述符是否就绪,就绪后恢复执行协程。

  • 資深大佬 : ysc3839

    总结起来是,协程跟 IO 多路复用关系不大,因为完全可以用协程写一个不涉及 IO 操作的代码,即使涉及到了 IO 操作,也可以使用多线程的模型。
    Python 的 asyncio 选择了单线程+IO 多路复用的模型,所以相关资料都会涉及,但是 asyncio 并不等同于协程。

  • 資深大佬 : irosyking

    1 、Async IO Framework = eventloop + non-blocking sockets + coroutines
    Async IO Framework = eventloop + non-blocking sockets + callbacks

    2 、Coroutine = Future + Task + Generator
    Lazy computation = Generator

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具