在Python asyncio中如何识别协程是否被block了

现在asyncio在Python中的使用越来越广泛了,但是很多人对于协程(corotine)的一些使用方式还不太熟悉。在这篇文章中,我将会介绍如何识别协程是否被block了,并以常用的HTTP网络库requests/httpx为例来说明如何避免协程被block的问题。

为什么协程会被block

在Python中,可以通过多协程的方式来实现并发,但是如果在协程中使用了阻塞的IO操作,那么这个协程就会被block,从而影响整个事件循环的执行。在这种情况下,虽然已经启动了很多协程,但是其实所有的协程都被卡主没有继续执行,也就不能发挥其并发的优势了。

一般来说,进行HTTP请求时,在Python中和asyncio配合的更多是httpx而非经典的requests库。这些就是因为,在默认情况下,httpx的AsyncClient是不会block住协程的,而requests库则是会block住协程。如果在多协程的情况下直接使用requests库,其实就没有发挥出任何协程的并发优势。

如何识别协程是否被block

我们可以通过一个独立的协程任务来检查自己是否block中,从而发现当前的事件循环中是否有协程被block。这个任务的视线方式如下:

import time
import asyncio

THRESHOLD = 0.01
FINISH = False

async def monitor_block():
    global FINISH
    max_diff = 0
    while not FINISH:
        t = time.time() 
        await asyncio.sleep(1.0)
        diff = time.time() - t - 1.0
        if diff > max_diff:
            max_diff = diff
        if diff > THRESHOLD:
            print(f'block found, diff {
     diff}s')
    print(f'{
     max_diff=}')

这个任务会每秒检查一次当前的时间是否和预期的时间相差太大,也就是asyncio.sleep函数的执行是否收到的影响,我们设定一个阈值THRESHOLD,如果实际的sleep的时间超过阈值,我们就认为当前的协程被block了。

下面实际比较一下requests和httpx的区别:

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

socratescli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值