loop对象
在Python中,当我们谈论“loop对象”时,可能是在谈论asyncio
库中的事件循环(Event Loop),它是处理异步I/O、延迟执行(asyncio.sleep()
)、任务(asyncio.Task
)等的核心组件。
Python的asyncio
库提供了一个高层次的接口来编写单线程并发代码,使用协程(coroutine)和事件循环来避免阻塞。
事件循环对象
在asyncio
中,可以通过asyncio.get_event_loop()
来获取当前的事件循环对象,或者通过asyncio.new_event_loop()
来创建一个新的事件循环。但通常,不需要手动创建新的事件循环,除非有特殊的需求。
事件循环的方法
事件循环对象提供了许多方法来操作异步任务和回调。以下是一些常用方法:
run_until_complete(future)
: 运行事件循环直到指定的future对象完成。create_task(coro)
: 安排一个协程对象以在事件循环中运行,并返回一个Task
对象。call_soon(callback, *args)
: 安排一个回调在事件循环的下一个迭代中运行。call_later(delay, callback, *args)
: 安排一个回调在指定的延迟后运行。call_at(when, callback, *args)
: 在指定的时间点安排一个回调运行(when
是一个时间戳)。stop()
: 停止事件循环。close()
: 关闭事件循环。
示例
以下是一个简单的示例,演示了如何使用事件循环来运行一个异步函数:
import asyncio async def say_hello_after(delay, name): await asyncio.sleep(delay) print(f'Hello {name}!') # 获取当前的事件循环 loop = asyncio.get_event_loop() # 使用事件循环运行异步函数 # 注意:在Python 3.7+中,你可以直接使用 asyncio.run(say_hello_after(1, 'World')) 代替下面的代码 try: loop.run_until_complete(say_hello_after(1, 'World')) finally: # 关闭事件循环 loop.close()
在这个示例中,定义了一个异步函数say_hello_after
,它使用asyncio.sleep
来模拟一个延迟。然后,获取当前的事件循环,并使用run_until_complete
方法来运行这个异步函数。最后,使用finally
块来确保事件循环被正确关闭。
但请注意,从Python 3.7开始,你可以直接使用asyncio.run(coro)
来运行一个异步函数,而无需手动获取和关闭事件循环。上面的示例可以简化为:
import asyncio async def say_hello_after(delay, name): await asyncio.sleep(delay) print(f'Hello {name}!') # 直接运行异步函数 asyncio.run(say_hello_after(1, 'World'))