协程篇

协程其实就是可以由程序自主控制的线程

在python里主要由yield 和yield from 控制,可以通过生成者消费者例子来理解协程

利用yield from 向生成器(协程)传送数据

传统的生产者-消费者是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。

如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,换回生产者继续生产,效率极高

1
2
3
4
5
6
7
8
9
10
11
12

import asyncio


async def hello():
print("Hello world!")
r = await asyncio.sleep(1)
print("Hello again!")


loop=asyncio.get_event_loop()
loop.run_until_complete(hello())

进程
   启动多个进程 进程之间是由操作系统负责调用
线程
   启动多个线程 真正被CPU执行的最小单位实际是线程
开启一个线程 创建一个线程 寄存器 堆栈
关闭一个线程
协程
本质上是一个线程
能够在多个任务之间切换来节省一些IO时间
协程中任务之间的切换也消耗时间,但是开销要远远小于进程线程之间的切换

在高IO的时候可以使用 例如爬虫, 爬虫需要请求很多url,使用协程可以让请求同时发出,而不会因为在等待一个url的请求响应而阻塞程序 基本上就是多线程适用的场景!!!

不适用于高计算的环境, 因为在计算时cpu是一直工作的, 频繁的切换运行的程序,会白白增加切换程序的时间,导致计算效率下降