小编Rom*_*kov的帖子

使用asyncio.wait_for和asyncio.Semaphore时如何正确捕获concurrent.futures._base.TimeoutError?

首先,我需要警告您:我是 asyncio 的新手,我立即警告您,我是 asyncio 的新手,我几乎无法想象引擎盖下的库中有什么。

这是我的代码:

import asyncio

semaphore = asyncio.Semaphore(50)

async def work(value):
    async with semaphore:
        print(value)
        await asyncio.sleep(10)

async def main():
    tasks = []
    for i in range(0, 10000):
        tasks.append(asyncio.wait_for(work(i), timeout=3))
    await asyncio.gather(*tasks)

loop = asyncio.get_event_loop()
future = asyncio.ensure_future(main())
loop.run_until_complete(future)
Run Code Online (Sandbox Code Playgroud)

我需要的是:协程work()完成时间不超过3秒,同时不超过50个。3 秒(超时)后,协程 work() 必须停止执行,新的 50 个任务必须开始工作。但就我而言,3秒后崩溃:

Traceback (most recent call last):
  File "C:/Users/root/PycharmProjects/LogParser/ssh/async/asyn_test.py", line 19, in <module>
    loop.run_until_complete(future)
  File "C:\Code\Python3\lib\asyncio\base_events.py", line 579, in run_until_complete
    return future.result()
  File "C:/Users/root/PycharmProjects/LogParser/ssh/async/asyn_test.py", line 15, in main
    await asyncio.gather(*tasks)
  File "C:\Code\Python3\lib\asyncio\tasks.py", line 449, …
Run Code Online (Sandbox Code Playgroud)

python semaphore python-3.x async-await python-asyncio

7
推荐指数
1
解决办法
6544
查看次数