asyncio.run()报错 Passing coroutines is forbidden, use tasks explicitly.
时间: 2024-09-12 14:03:50 浏览: 239
`asyncio.run()` 是 Python 中用于运行最高级别入口点“主”可调用的函数,它会运行直到完成。这个函数是异步的,并且不能在其他协程内部被调用。如果你尝试将一个协程直接传递给 `asyncio.run()`,它会报错“Passing coroutines is forbidden, use tasks explicitly.”,因为这个函数期望的是一个可调用的对象,它会在事件循环中执行。
错误信息表明,你不能直接将协程(coroutine)对象传递给 `asyncio.run()`,而应该使用 `asyncio.create_task()` 或其他方法显式地创建一个任务(task)。任务是用来安排协程异步运行的对象,它们允许协程在事件循环中被调度和运行。
如果你想要运行一个异步函数 `my_async_function`,你应该先确保你创建了一个任务,然后将这个任务传递给 `asyncio.run()`。例如:
```python
import asyncio
async def my_async_function():
# 这里是你的异步代码
pass
# 创建任务
task = asyncio.create_task(my_async_function())
# 运行事件循环并等待任务完成
asyncio.run(task)
```
在这个例子中,`asyncio.create_task()` 创建了一个任务,然后 `asyncio.run()` 被用来运行这个任务。
相关问题
import asyncio import time async def func1(): print('这是aaa') await asyncio.sleep(3) print('这是aaa') async def func2(): print('这是bbb') await asyncio.sleep(2) print('这是bbb') async def func3(): print('这是ccc') await asyncio.sleep(4) print('这是ccc') if __name__ == '__main__': f1 = func1() f2 = func2() f3 = func3() tasks = [f1, f2, f3] t1 = time.time() asyncio.run(asyncio.wait(tasks)) t2 = time.time() print(t2-t1) 请问我的Python是目前官方最新版本,为什么我这种异步写法的代码会报错, 错误为TypeError: Passing coroutines is forbidden, use tasks explicitly.
这是因为最新版的Python已经不允许直接将协程对象传递给asyncio.wait()函数,需要将协程对象转换成任务对象。可以使用asyncio.create_task()函数将协程对象转换成任务对象,然后将任务对象加入到任务列表中即可。修改后的代码如下:
```python
import asyncio
import time
async def func1():
print('这是aaa')
await asyncio.sleep(3)
print('这是aaa')
async def func2():
print('这是bbb')
await asyncio.sleep(2)
print('这是bbb')
async def func3():
print('这是ccc')
await asyncio.sleep(4)
print('这是ccc')
if __name__ == '__main__':
f1 = asyncio.create_task(func1())
f2 = asyncio.create_task(func2())
f3 = asyncio.create_task(func3())
tasks = [f1, f2, f3]
t1 = time.time()
asyncio.run(asyncio.wait(tasks))
t2 = time.time()
print(t2-t1)
```
这样就可以正常运行了。
阅读全文