Asyncio模块无法创建任务

2022-03-25 00:00:00 python python-3.x python-asyncio

问题描述

我的源代码:

import asyncio

async def mycoro(number):
    print(f'Starting {number}')
    await asyncio.sleep(1)
    print(f'Finishing {number}')
    return str(number)

c = mycoro(3)
task = asyncio.create_task(c)
loop = asyncio.get_event_loop()
loop.run_until_complete(task)
loop.close()

错误:

RuntimeError: no running event loop
sys:1: RuntimeWarning: coroutine 'mycoro' was never awaited

我在看教程,根据我的代码,当我看的时候从来没有预料到它会出现,在我正在观看的视频中很明显是这样。


解决方案

只需直接运行协程,而不为其创建任务:

import asyncio

async def mycoro(number):
    print(f'Starting {number}')
    await asyncio.sleep(1)
    print(f'Finishing {number}')
    return str(number)

c = mycoro(3)
loop = asyncio.get_event_loop()
loop.run_until_complete(c)
loop.close()

asyncio.create_task的目的是从正在运行的任务内部创建其他任务。因为它直接启动新任务,所以必须在正在运行的事件循环内使用它,因此在外部使用它时会出错。

如果必须从任务外部创建任务,请使用loop.create_task(c)


在较新版本的asyncio中,使用asyncio.run可以避免显式处理事件循环:

c = mycoro(3)
asyncio.run(c)

通常,仅使用asyncio.create_task增加并发性。当另一个任务会立即挡路时,请避免使用它。

# bad task usage: concurrency stays the same due to blocking
async def bad_task():
    task = asyncio.create_task(mycoro(0))
    await task

# no task usage: concurrency stays the same due to stacking
async def no_task():
     await mycoro(0)

# good task usage: concurrency is increased via multiple tasks
async def good_task():
    for i in range(3):
        asyncio.create_task(mycoro(i))
    print('Starting done, sleeping now...')
    await asyncio.sleep(1.5)

相关文章