请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么需要loop.run_forever?

import asyncio
import time

async def get_html(sleep_times):
    print("waiting")
    await asyncio.sleep(sleep_times)
    print("done after {}s".format(sleep_times))


if __name__ == "__main__":
    task1 = get_html(2)
    task2 = get_html(3)
    task3 = get_html(3)

    tasks = [task1, task2, task3]

    loop = asyncio.get_event_loop()

    try:
        loop.run_until_complete(asyncio.wait(tasks))
    except KeyboardInterrupt as e:
        pass
        all_tasks = asyncio.Task.all_tasks()
        for task in all_tasks:
            print("cancel task")
            print(task.cancel())
        loop.stop()
        loop.run_forever()
    finally:
        loop.close()

老师,在您的代码中我有些不理解这个loop.stop()和loop.run_forever()。
我是这么想的,在代码运行的时候Ctrl+C终止代码会导致事件循环终止,直接进入到异常处理中,但是您在异常处理中又使用了loop.stop(),意思是Ctrl+C并不会终止事件循环是吗?后面的那个loop.run_forever()就更加不能理解了,在这里写一句这个岂不是和while True一样,一直在这里循环,怎么会去执行finally中的代码呢?感觉有点不可思议,还有就是那个Task was destroyed but it is pending!这个错误的原因我也没有排查出来,为什么会出现这个错误呢?

正在回答 回答被采纳积分+3

1回答

bobby 2020-07-05 19:45:36

ctrl+c和直接进程中杀死进程不一样的, ctrl+C一般情况下这个关闭信息程序可以捕捉, 也就是说如果你捕捉到了这个信号 然后再这个信号处理事件中你什么都不做 那么你的程序就无法被ctrl+c终止。如果你是强杀进程这个处理方式你的代码是无法捕捉到的 所以一般程序都会处理ctrl+c信号 来做优雅退出处理

0 回复 有任何疑惑可以回复我~
  • 提问者 荒小七 #1
    老师,有一点还是不明白,为什么要重新启动时间循环呢,在异常处理中,在视频中,loop. stop后面直接close会报那个错误,所以加上loop. forever,这个为什么是这样的呢,在他事件循环停止后直接关掉不行吗,总感觉这里怪怪的
    回复 有任何疑惑可以回复我~ 2020-07-05 19:50:11
  • bobby 回复 提问者 荒小七 #2
    能具体说明一下视频哪个时间点提到了这个吗 之前的版本好像有这个问题 不过好像新的版本中不需要这样做了
    回复 有任何疑惑可以回复我~ 2020-07-07 10:24:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信