上周写个爬虫,想着用asyncio提速,结果把自己绕进回调地狱里三天。
一开始是async def套async def,然后为了处理异常又加了try-except裹三层,最后发现某个第三方库不支持异步,只能用asyncio.run_in_executor包一下。代码看着跟意大利面似的,debug的时候根本不知道哪个协程在哪挂掉的。
最坑的是gather和wait的区别,我以为return_exceptions=True能捕获所有错误,结果有个任务直接CancelledError给我干懵了,日志里啥都没有,跟鬼打墙一样。
后来重构了两次,把逻辑拆成小块,用asyncio.Queue做生产者消费者,才算能看。现在代码是顺了,但那段时间做梦都在想event loop有没有关干净。
你们写异步的时候有没有被async和await的位置搞疯过?