尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python 异步编程避坑指南:这5个错误90%的开发者都犯过

Python 异步编程避坑指南:这5个错误90%的开发者都犯过 异步编程避坑指南这5个错误90%的开发者都犯过问题场景上一个月的时候, 我针对一个同事所撰写的PR进行了处理, 那个同事编写了一个具备异步特性的爬虫程序, 其目的在于想要以并发的方式去抓取总计整整100个网页。那代码呈现出来大体是这样的:他觉得只要用了async/await那便是并发, 可实际上这段代码全然是串行的, 100个请求是一个接着一个地发送, 相较于不启用异步而言还要更慢多了协程切换所产生的开支。解决方案正确的写法是用 . 或 一个改动, 将串行转变为并发, 100个请求同时发送出去。在你的机器那儿, 耗时从50秒降低到2秒。原理解析的核心是事件循环。当你写事件循环会使当前协程的执行暂停, 去执行fetch(url), 等fetch返回之后, 再让当前协程恢复, 继续进行下一轮的循环, 所以在for循环里, 要对每个请求进行await, 这就相当于等一个请求完成之后, 再去做下一个请求。而.会将所有协程同时提交给事件循环, 事件循环会在它们之间来回进行切换, 哪个协程先完成, 就先返回哪个协程, 这就是协程并发的本质, 不是多线程, 而是事件循环的高效调度。进阶: 另外4个常见错误, 错误2: 于async函数当中调用同步阻塞代码, 相关代码库属于同步阻塞性质, 在async函数里进行调用的话, 会致使整个事件循环陷入卡住状态, 应改用 或者httpxasync模式。错误3忘记 . 导致协程静默丢失正确的做法是, 把task引用进行保存, 以此来确保await或者它。错误4在 里直接 await因是运行于事件循环之上, 所以直接进行await会产生冲突, 于是要用 或者将异步逻辑去封装成函数。错误5无限等待——忘记设置永远给网络请求加 总结异步编程最大的坑不是语法而是心智模型。关键就两句话记住这两条, 能避开80%的异步陷阱, 其中await等于等待这一个完成, 进而串行 , 斜杠等于让事件循环调度从而并发。---*本文由 AI 辅助创作。关注我每周分享 进阶技巧。*
返回列表