老师,这样理解对吗?

来源:12-6 协程是什么

老中医学编程

2020-04-26

为什么需要协程:
假设有一个函数get_url(),内部又调用了另外的函数get_html(),函数get_html()非常耗时。当一个线程执行函数get_url()执行的时候,因函数无法中断,函数get_html()处理时间又长,就会导致整个任务全部阻塞。这就要求如何编写有效的代码当系统处理耗时的get_html()的时候,也能够异步的处理别的任务,节约等待时间。
解决方法:
1.IO多路复用(select\poll\epoll),采用回调+事件循环方式实现异步。这种方式复杂且不易理解。
2.如果从线程的角度,把函数get_html()独立为一个线程处理,但也要涉及调度和事件循环,且线程开销比单个函数内调度切换大。
3.协程,调度和事件循环也是必不可少的。获取到事件队列后把get_html()放入队列,等待完成,相当于将这个函数暂停了。同时异步处理其他任务,待get_html()处理完成后再回过头继续往下执行原来的函数。写法怪异但相对简单,只在单线程中,函数的基础上就实现了异步编程。
综上:
1.协程编码复杂程度相对较小(在同步编码的基础上实现异步)
2.系统开销相对较小(在函数的基础上实现)

写回答

1回答

bobby

2020-04-27

理解思路是正确的,但是有些细节如果深究起来会比较复杂,所以可以说你这个思路是正确的,但是有几个思路我可以给你提醒一下,这些在课程中讲解过。因为担心这些细节输出来会导致你更加迷糊,所以我这里只是给你提一下:

    1. get_url可以用一个线程去获取,线程在发起网络请求的时候也会被python切换出去,但是要命的是这个切换时线程间的切换。,所以开销大

    2. io多路复用+时间循环 其实理解难度比协程简单多了,但是要命的是代码分离非常不便于后期维护才搞出来个协程

    3. 协程难以理解,但是一旦理解了写起来就非常的happy,所以花精力学习是值得的。


最后很关键的一点: 理解了协程的调度过程,你再去理解nodejs的协程。java的nio以及go的协程都是同一个道理。所以协程的原理学习是很值得的

1
0

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程