让我帮你用Python脚本改成异步,过程比我想的顺利

📅 2026/8/23 6:35:48
让我帮你用Python脚本改成异步,过程比我想的顺利
我存在着一个所写的同步版本的爬虫脚本, 它已然稳定运行了大半年的时间, 每一次针对20个页面进行爬行, 大概需要2分钟的时长。我持续有着将其转变为异步版本的想法, 然而却担心修改完毕后会出现一堆的漏洞, 进而导致反而不利于维护。上个月最终下定决心着手开展此项工作, 借助AI予以修改, 其呈现出的效果, 比我预先设想的还要出色。对此记录一下整个的改造历程。直接把同步代码给AI改就行我先前觉得要先将所有的函数调用关系梳理清楚, 把改造计划制定好, 如此这般AI才能够着手行动。在试过以后发觉并非那般繁杂, 把整个同步版的代码粘贴给它, 告知“改成运用的异步版本”, 然后它就开始操作了。哪些函数需要改成异步, AI能够识别出来——改为的.get会被识别, .并发会取代for循环, await将替换同步等待。它把这些“机械的转换”做得既快且准。但是, 它有可能会将全部函数都转变为async的, 这里面涵盖了那些并不需要异步操作的工具函数。修改完成之后咱们得仔细捋一遍, 把那些不需要异步的函数再改回到原来的状态。另外, 还有一些依靠None进行初始化的变量, 在异步版本当中呢极有可能是需要进行调整的。而这些细微环节, AI有的时候是会遗漏掉的。并发控制自己来加对于 AI 而言, 其在默认情况下是不会去进行并发控制方面的操作。要是你有20个URL给到它, 那么它就会一次同时发起20个请求——可要是你的目标乃同一个网站的话, 这种行为就有可能会触发对应的反爬策略, 并且, 也还有可能会将别人的服务器给弄崩溃掉。我自行添了一个., 限定同时顶多数目为 5 个请求, 此需求你得“告知”AI——“帮给我增添并发控制, 于此同时顶多数目是 5 个请求”。要是不说, 那它便不予以添加。存在着另外一种管理情况。人工智能有可能会在并发请求当中共享一个这种情况是正确的, 然而却有可能在程序结束之际忘记去关闭。自行检查一下结尾处是否存在await .close() 或者选用async with去进行自动管理。超时和重试不能忘如果一个请求hang住了的话, 默认没有超时, 整个事件循环都会被卡住, 这需要在创建时加上。同理,异常重试的逻辑AI一般不会主动加, 是需要在里说明的。有个情况被我遇上了, 那就是, 在进行了异步修改之后, 存在这样的状况, 一些请求, 由于网络出现波动, 导致其失败了, 然而, 重试机制却丢失不见。原本在同步版本的时候, 我所采用的是Retry, 可是在改成异步之后, 这套机制就不起作用了。人工智能没有给我提醒, 在运行了好几轮之后, 我才察觉到这个问题。后来, 我借助手动方式, 运用“.”来增添超时情况, 借此通过for循环达到重试目的。虽说代码相比从前长了那么一丁点儿, 然而稳定性却提升了不少。可是, 这些“工程化的细节”, AI是不会帮你进行思考的。调试异步代码确实麻烦一些当同步代码出现错误之际, 其堆栈信息呈现得清晰明了, 只需一步步依循着去走便可。而异步代码一旦发生错误, 堆栈之中充斥的尽是Task、event loop的相关信息, 极难在一眼之下就分辨出究竟是在哪一个请求、哪一个步骤出现了差错。之后我所养成的一个调试方面的习惯, 是于每个处于关键位置的await语句的前面之时以及后面之际添加日志, 以此进行对请求URL以及时间戳的记载。尽管这增添了好些日志行, 然而在出现问题时点便能一下子看清究竟是哪个请求陷入了卡住的状况。存在着这样一个用于异步调试的颇为不错的工具, 那便是的debug模式, 将环境变量设置为等于1, 它能够协助你记录下那些已经被创建然而却并未被await处理的情况, 从而避免出现那种“偷偷地被漏掉”的状态。将同步进行改造成为异步, 人工智能完成了百分之九十的代码转换工作任务, 自己再去添加并发控制以及错误处理设置。from异步定义一个名为fetch的函数, 它带有参数, 参数包括url, 还有sem, 并且有一个默认值为3的retry参数。AI生成的主体 自己加的并发控制和重试async with sem: # ← 自己加的并发控制 (total30) # ← 自己加的超时针对范围在重试之处, 进行循环操作, # ← 这儿添加重新尝试操作。try:async with .get(url, ) as r:await r.json()as e:print(f{1}/{retry}{url} 失败: {e})if retry - 1:await .sleep(1)else:Noneasync def main():urls f{i} for i in range(20)sem .(5) # 同时最多5个async with .() as :tasks 对于urls中的每个url, 执行fetch(, url, sem)。 await .(*tasks)r for r in if r.run(main())能将同步代码转变为异步, AI具备协助你处理百分之九十机械转换工作的能力。剩余的百分之十, 即并发控制、超时重试以及日志监控, 需要你自行补充完善。然而总体来讲, 节省了非常多的时间。