【发布时间】:2020-12-04 17:15:04
【问题描述】:
说明:(简体)
- 我有 2 个任务。
- 在每个任务中,我有 3 个协程。
- 第一个任务的 2 个协程失败。 (模拟)
- 在处理任务结果时,我收到一条“从未检索到任务异常”消息。
- 我认为这是因为仅处理了该任务中两个失败的协程之一的异常。
- 如何处理任务中两个协程的异常和/或避免“从未检索到任务异常”消息?
代码:(简体)
import asyncio
async def download(data):
filename = "*" if data in ["b", "c"] else data # simulated failure
with open(filename, "w") as f:
f.write(data)
async def coro(data_list):
coroutines = [download(data) for data in data_list]
for coroutine in asyncio.as_completed(coroutines):
await coroutine
async def main():
task1 = asyncio.create_task(coro(["a", "b", "c"]))
task2 = asyncio.create_task(coro(["d", "e", "f"]))
results = await asyncio.gather(task1, task2, return_exceptions=True)
for _ in results:
pass
asyncio.run(main())
输出:(简化)
Task exception was never retrieved
future: <Task finished coro=<download() done, defined at D:/myscript.py:2> exception=OSError(22, 'Invalid argument')>
Traceback (most recent call last):
File "D:/myscript.py", line 4, in download
with open(filename, "w") as f:
OSError: [Errno 22] Invalid argument: '*'
【问题讨论】:
-
您能否对公共 URL 重复同样的问题,以便我们尝试并重现它?
-
@user4815162342 - 谢谢。是的,我已经大大简化了代码并使其可重现。还将问题范围缩小到仅 asyncio。请参考编辑后的问题。
-
也许你在简化方面走得太远了,因为这是一个完全不同的错误——Windows 不喜欢文件名中的
*字符,并且文件名通配符不适用于 Python 的 @987654324 @无论如何。 -
是的。我故意添加了错误的文件名
*,只是为了模拟任务异常并查看如何检索所有异常。
标签: python asynchronous python-asyncio coroutine