Event Loop

Python SELF ZH
第 25 级 , 课程 5
可用

6.1 获取事件循环

事件循环 (Event Loop) 是使用 asyncio 模块进行 Python 异步编程的核心组件。它管理异步任务的执行、事件处理 和输入输出操作的执行。事件循环允许多个任务同时执行,不会阻塞主 执行线程。

创建和获取事件循环

  • asyncio.get_event_loop(): 返回当前的 事件循环或如果当前没有就创建一个新的。
  • asyncio.new_event_loop(): 创建一个新的 事件循环。
  • asyncio.set_event_loop(loop): 设置 指定的事件循环为当前的事件循环。

例子:

asyncio 有一个当前事件循环,包含所有正在执行的任务。你可以获取当前事件循环或者创建一个新的并将其设置为当前的。例子如下:


import asyncio

loop = asyncio.get_event_loop()
print(loop)  # 当前事件循环
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
print(asyncio.get_event_loop())  # 新设置的事件循环

值得注意的是,方法 get_event_loop() 返回当前活动的事件循环。创建新的事件循环及其设置应谨慎使用,以避免在异步应用程序中出现冲突。

运行事件循环

  • run_forever(): 启动事件循环并 继续运行直到调用 stop()
  • run_until_complete(future): 启动事件 循环并在指定的协程或未来对象完成后终止。

例子:

事件循环可以以两种模式启动:无限运行——有点像 while True,或者直到特定任务完成。


import asyncio

async def hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

如果你在 run_forever() 模式下启动了 Event Loop,它会无限循环。方法 run_forever() 只有在某个异步任务调用 EventLoopstop() 方法时才会停止。

停止事件循环

  • stop(): 停止事件循环。
  • is_running(): 返回 True,如果事件 循环正在运行。

例子:

如果循环在无限模式下运行,它会不断接收任务并执行它们,自己是不会停的。必须由某个对象获取当前循环并调用 stop() 方法。为了知道无限循环是否正在运行,可以调用 is_running() 方法。


import asyncio
            
loop = asyncio.get_event_loop()
loop.stop()
print(loop.is_running())  # False

6.2 事件循环的重要方法

方法 call_soon(callback, *args)

尽量快地计划调用函数 callback,参数为 *args


import asyncio

def my_callback():
    print("Callback executed")
            
loop = asyncio.get_event_loop()
loop.call_soon(my_callback)
loop.run_forever()

将函数 callback 放置于任务列表的最前,以便尽快执行。可以传入非异步函数。这个方法在异步应用中需要立即响应时很有用。

方法 call_later(delay, callback, *args)

计划在 delay 秒后调用函数 callback,参数为 *args


import asyncio

def my_callback():
    print("Callback executed after delay")
            
loop = asyncio.get_event_loop()
loop.call_later(2, my_callback)
loop.run_forever()

此方法允许延迟调用函数:第一个参数是秒数(可以是小数),然后是函数引用及其参数。可以传入非异步函数。这个方法在设计复杂的异步系统时很有用。

方法 call_at(when, callback, *args)

计划在时间点 when 调用函数 callback,参数为 *args


import asyncio
import time
            
def my_callback():
    print("Callback executed at specific time")
            
loop = asyncio.get_event_loop()
when = loop.time() + 2  # 事件循环当前时间的2秒后
loop.call_at(when, my_callback)
loop.run_forever()

如果你想在特定时间如 15:00 或 24:00 运行一个任务,可以使用 函数 call_at(),与 函数 call_soon() 类似,但第一参数传入的不是延迟时间,而是需要运行任务的具体时间。可以传入非异步函数。

优点和特点

异步执行: 事件循环允许 多任务并行执行,不会阻塞主执行线程。

高效的资源管理: 异步 输入输出操作非阻塞执行,使程序更高效。

灵活和可扩展性: 事件循环 支持多种方法来计划任务和处理事件,允许构建复杂且可扩展的 异步应用程序。

6.3 与任务和未来对象的交互

事件循环管理任务(Tasks)和未来对象(Futures)的执行。它跟踪它们的状态并确保它们在准备就绪后得到执行。

例子:


import asyncio

async def main():
    await asyncio.sleep(1)
    print("Task completed")
            
loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)

本例展示了事件循环如何管理通过create_task方法创建的任务。方法 call_soon(), call_later()call_at() 可以用于管理具有不同优先级的任务执行,这在设计复杂异步系统时非常有用。

1
Опрос
多线程,  25 уровень,  5 лекция
недоступен
多线程
多线程
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION