Httpx(异步的Requests库)实际使用中的一些技巧和心得

简单的说,同步库下的Httpx的用法基本完全等价于Requests库的用法,其中requests的session和Httpx中的client基本都是一个东西。

 

1. 简单的例子:

self.client = httpx.AsyncClient(proxies=self.proxylist[0])

respond = await self.client.post(url, data=inputdata,headers = headers)

在实例化时期先将AsyncClient 建立好,在需要清理资源时候使用 self.client.close(),注意两点:

httpx有client 和 AsyncClient两种client,如果需要在异步环境中使用务必选用AsyncClient。

  • AsyncClient和proxy是绑定的,我没找到相关更换proxy的方法(如果大佬知道务必告诉小弟一声)
  • AsyncClient 的上下文管理器需要用async with 我这里没有用是因为想说明client 的关闭和开启可以自己控制,更换proxy时候需要控制其关闭和开启,大家使用时候应该要注意自己的使用逻辑。

 

2.常见proxy异常:

  • httpx.ProxyError 当所调用的代理格式出问题,或者链接不上时候会在 调用respond的future对象的结果时候request_result_future.result()抛出这个异常
  • 第二个是逻辑上的异常,当两个request同时通过一个client 同时发出,一个request因为异常或者其他逻辑关闭了client 会抛出
  •   [SSL: APPLICATION_DATA_AFTER_CLOSE_NOTIFY] application data after close notify (_ssl.c:2745)异常,这里需要在逻辑里处理。

 

3. 异步HTTPx经验总结:

  • 异步调用httpx的request只能用AsyncClient的client去处理get post这类的语句(类似于requests的Session的方法)
  • 如果远端返回的是json 可以用 respond.json()直接拿到dict体,但注意:当远端返回404、403等错误页面时候这个json不是仅仅拿不到东西,而是抛出解析异常,需要捕获。
  • 将任务添加到loop中可以用self.loop.create_task(woo()) 其中woo是一个coroutine对象(就是那个async def定义的函数。)
  • 异步最重要的是当这个程序被异步的形式放到loop里,它的异常是怎么捕获的(调用future.result()的时候抛出)如何在逻辑避免或者解决当一起放入loop里的若干个request出现问题时候 对共享的client环境做出改变后,其他的request如何处理
  • 当要给一个task绑定一个callback时候可以用 self.prefetch_task.add_done_callback(self.build_prefetch_callback)
    但是要注意,这个callback是一个普通函数,不是异步函数,如果有部分内容需要异步调用 可以再用loop.create_task 方法将任务加入到loop中
  • 在逻辑上要注意一个条件/异常发生时候,loop中是否有相关的任务,有的话如何处理,多次调用callback的话,这个情况会比较复杂 编程时候要多注意。
  • 一个线程里只有一个loop,但是在asyncio.get_event_loop() 调用的时候可能你的程序并不在你想象的那个程里,这里要考虑用 asyncio.set_event_loop 让你的程序在这个线程里能调用到你想要调用的loop
  • 想让程序更快,可以在等待的循环里调用一个 await asyncio.sleep(0.1)(作用相当于yield 不过有个0.1的时间让CPU有时间去处理其他事情),如果你用await asyncio.sleep(0)那程序就会把所在的CPU线程怼到99%(程序不断的在你的等待循环里和外部代码中切换)只要睡眠一点点这个程序就不会把CPU占满。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值