请问下面异步嵌套的 await 为什么会导致 mongo 入库失败

请问下面异步嵌套的 await 为什么会导致 Task <Task pending coro=<fetch() running at xxxx.py:45> cb=[gather.<locals>._done_callback()
回调失败 ?

加入了异步插入 mongo 后导致的,去掉入库那一段就没问题。


mongo_client = AsyncIOMotorClient(connect_uri)
collection = mongo_client[\'db_stock\'][\'new_stock_ttjj\']

def parse_json(content):
   # 解析
    content += \';function getV(){return hsEnHLwG;}\'
    ctx = execjs.compile(content)
    result = ctx.call(\'getV\')
    return result

async def update_data(data):
   # 异步 mongo 入库 
    code = data[\'securitycode\']
    found =  await collection.find_one({\'securitycode\':code})
    if not found:
        await collection.insert_one(data)


async def fetch(session,page):

    async with session.get(home_url.format(page),headers=headers) as resp:
        content = await resp.text()

        try:
            js_content = parse_json(content)
            for stock_info in js_content[\'data\']:
                securityshortname = stock_info[\'securityshortname\']

                print(securityshortname)
                await update_data(stock_info)
        except Exception as e:
            print(e)


async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get(home_url.format(1), headers=headers) as resp:

            content = await resp.text()
            js_data = parse_json(content)
            pages = js_data[\'pages\']
            tasks =[]
            for page in range(1,pages+1):
                task = asyncio.ensure_future(fetch(session,page))
                tasks.append(task)

            await asyncio.gather(*tasks)

asyncio.run(main())

相关文章

3 thoughts on “请问下面异步嵌套的 await 为什么会导致 mongo 入库失败

  1. 找到原因:
    def run(main, *, debug=False):
    if events._get_running_loop() is not None:
    raise RuntimeError(
    “asyncio.run() cannot be called from a running event loop”)

    if not coroutines.iscoroutine(main):
    raise ValueError(“a coroutine was expected, got {!r}”.format(main))

    loop = events.new_event_loop()

    asyncio.run 内部定义了一个 loop,
    moto 初始化的时候内部也用了这个。

    用 loop 定义,motor 的定义放在 loop 后面。

发表评论

邮箱地址不会被公开。 必填项已用*标注