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()
只有在某个异步任务调用 EventLoop
的 stop()
方法时才会停止。
停止事件循环
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()
可以用于管理具有不同优先级的任务执行,这在设计复杂异步系统时非常有用。
GO TO FULL VERSION