python 关于协程阻塞缺陷的学习

协程是线程中的一组程序

>协程一定是两个以上的协程在一个线程中一起工作,
所以本质就是一个程序等待另外一个程序完成或中断,以后再运行
用时序图非常容易理解,但不完全正确,因为两个协程之间可以没有依赖关系,这点特征和多线程一样

协程可以并列运行

+ 一种  把协程加入指定线程中
	`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 有机统一了线程和协程.

结语: 单个线程中的协程遇到阻塞,只能停止整个线程, 这点是无法违背的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值