请问下面异步嵌套的 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())
1
keepeye 2020-11-25 16:26:50 +08:00
task = asyncio.ensure_future(fetch(session,page))
似乎可以改成 task = fetch(session,page) |
3
yagamil OP 找到原因:
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 后面。 |
4
n37r09u3 2020-11-25 17:25:26 +08:00
放后面是用同一个 loop 了 吧?
|