当你在自己的 Python 程序中采用了基于事件循环的异步编程方法之后,你就会发现自己不自觉地被其牢牢吸引住,并不是说这一方法多么棒,而是因为你不得不想办法保证程序中的任意环节都不能是阻塞的!
例如当前的场景是希望从 MongoDB 中读取每一条未处理过的数据,下载并保存其中的图片信息,然后更新数据库的内容。Python 常用的 MongoDB 异步驱动是 Motor :
结合 asyncio 使用方法如下:
importmotor.motor_asyncio
importasyncio
client = motor.motor_asyncio.AsyncIOMotorClient()
db = client.test_database
asyncdefrun():
asyncfor mmin db.test_database.find({"status": 0}):
print(mm['img_src'])
# Download Image Here
# dl_img(mm['img_src'])
awaitdb.test_database.update({"_id": mm['_id']}, {"$set": {"status":1}})
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
此时如果 dl_img() 处的操作是阻塞的,那么异步处理就没有意义了。当然这里依然可以借助异步网络请求库 aiohttp 来实现图片