loop对象

在Python中,当我们谈论“loop对象”时,可能是在谈论asyncio库中的事件循环(Event Loop),它是处理异步I/O、延迟执行(asyncio.sleep())、任务(asyncio.Task)等的核心组件。

Python的asyncio库提供了一个高层次的接口来编写单线程并发代码,使用协程(coroutine)和事件循环来避免阻塞。

事件循环对象

asyncio中,可以通过asyncio.get_event_loop()来获取当前的事件循环对象,或者通过asyncio.new_event_loop()来创建一个新的事件循环。但通常,不需要手动创建新的事件循环,除非有特殊的需求。

事件循环的方法

事件循环对象提供了许多方法来操作异步任务和回调。以下是一些常用方法:

  1. run_until_complete(future): 运行事件循环直到指定的future对象完成。
  2. create_task(coro): 安排一个协程对象以在事件循环中运行,并返回一个Task对象。
  3. call_soon(callback, *args): 安排一个回调在事件循环的下一个迭代中运行。
  4. call_later(delay, callback, *args): 安排一个回调在指定的延迟后运行。
  5. call_at(when, callback, *args): 在指定的时间点安排一个回调运行(when是一个时间戳)。
  6. stop(): 停止事件循环。
  7. 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'))

 

posted @ 2024-06-18 22:08  JJJhr  阅读(5)  评论(0编辑  收藏  举报