【发布时间】:2022-11-26 13:40:41
【问题描述】:
考虑以下代码:
import asyncio
sem: asyncio.Semaphore = asyncio.Semaphore(2)
async def async_run() -> None:
async def async_task() -> None:
async with sem:
await asyncio.sleep(1)
print('spam')
await asyncio.gather(*[async_task() for _ in range(3)])
asyncio.run(async_run())
使用 Python 3.10.6 (Fedora 35) 运行,就像教科书中一样。
但是,当我使用 Python 3.8.10 (Ubuntu 20.04) 运行它时,出现以下错误:
Traceback (most recent call last):
File "main.py", line 21, in <module>
asyncio.run(async_run())
File "/usr/lib/python3.8/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
return future.result()
File "main.py", line 18, in async_run
print(future_entry_index, await future_entry)
File "/usr/lib/python3.8/asyncio/tasks.py", line 619, in _wait_for_one
return f.result() # May raise f.exception().
File "main.py", line 11, in async_task
async with sem:
File "/usr/lib/python3.8/asyncio/locks.py", line 97, in __aenter__
await self.acquire()
File "/usr/lib/python3.8/asyncio/locks.py", line 496, in acquire
await fut
RuntimeError: Task <Task pending name='Task-4' coro=<async_run.<locals>.async_task() running at main.py:11> cb=[as_completed.<locals>._on_completion() at /usr/lib/python3.8/asyncio/tasks.py:606]> got Future <Future pending> attached to a different loop
导致错误的是 async with sem 行和 Semaphore 对象。没有它,一切都没有错误,但不是我想要的方式。
我无法在任何地方提供 loop 参数,因为即使在允许的地方,它自 Python 3.8 以来已被弃用并在 Python 3.10 中被删除。
如何使代码与 Python 3.8 一起工作?
更新。瞥一眼 asyncio 代码就会发现 Python 版本差异很大。然而,信号量不能在 3.8 中被破坏,对吧?
【问题讨论】:
标签: python python-3.x python-asyncio python-3.8 python-3.10