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

发布于 2022-09-06 13:09:08 字数 700 浏览 22 评论 0

请教一个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。请问这个该怎么实现呢?

谢谢了先!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

禾厶谷欠 2022-09-13 13:09:08

题主的真正需求:给任务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。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文