协程是线程中的一组程序
>协程一定是两个以上的协程在一个线程中一起工作,
所以本质就是一个程序等待另外一个程序完成或中断,以后再运行
用时序图非常容易理解,但不完全正确,因为两个协程之间可以没有依赖关系,这点特征和多线程一样
协程可以并列运行
+ 一种 把协程加入指定线程中
`loop.run_in_executor(executor, calc_fib, 36)`
+ 另一种 一开始就把一组协程,打包成并列任务,一起运行
`tasks = [asyncio.ensure_future(函数(i)) for i in range(20)]
loop.run_until_complete(asyncio.gather(*tasks))`
协程 会被阻塞
>注意: 因为线程遇到io 阻塞是会停止的, 所以协程中如果有阻塞函数, io阻塞时,所有并列运行的协程都会被阻塞, 也就是中断,当阻塞时,cpu自动切换到其他线程
例如 queue.get()就是一个典型的阻塞方法,
会导致协程所在的线程停止
所以并列协程不可以代替多线程,就因为这个阻塞问题
如果非要用并列协程代替多线程, 必须注意协程中间不能有引发io阻塞的函数
推荐Greenlet组件
Greenlet。特点就是,遇到IO阻塞就会自动切换任务。
可以理解为 Greenlet 有机统一了线程和协程.
结语: 单个线程中的协程遇到阻塞,只能停止整个线程, 这点是无法违背的