请问:Python的Ascynio模块怎么中止EventLoop?

请教一个Python的Ascynio模块中止异步IO的EventLoop的问题。现在我有2个任务,任务1的执行时间可能比较长(比如35秒左右),任务2的执行时间非常短、可以认为瞬间完成。我需要的代码是:先执行任务1,然后等待30秒,如果任务1完成了那么结束;如果任务1没完成那么去执行任务2然后结束。

以下代码是个非常简单的并发执行,

    @asyncio.coroutine
    def async_task_1():
        执行任务1
    @asyncio.coroutine
    def async_task_2():
        yield from asyncio.sleep(30)
        执行任务2
        
    loop = asyncio.get_event_loop()
    tasks = [async_task_1, async_task_2]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()

但是以上代码有个缺陷:毕竟是loop.run_until_complete,也就是说即使任务1执行时间奇长,loop也会等它到地老天荒。但是我要的是最多等30秒,如果等不到任务1完成,那就做任务2然后结束。任务2的运行时间几乎为0。请问这个该怎么实现呢?

谢谢了先!

阅读 2.7k
1 个回答

题主的真正需求:给任务1设置个 超时,超过一定时间,就放弃执行。转而执行任务 2。

所以可以考虑对任务 1 使用 asyncio.wait_for 包裹一下。

举个?:

import asyncio


async def task1():
    print('task1 begin')
    await asyncio.sleep(3)
    print('task1 finish')  # will never finish


async def task2():
    try:
        await asyncio.wait_for(task1(), timeout=2)
    except asyncio.TimeoutError:
        print('task1 timeout')
    print('task2 begin')
    # do something
    print('task2 finished')


loop = asyncio.get_event_loop()
loop.run_until_complete(task2())
loop.close()

另外,题主的题目可以修改一下,因为你只是想要中止一个 task 或者说一个 coroutine,并非中止 eventloop。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题