9/30 python异步编程

同步与异步:同步即进程在执行任务时无法进行其他任务,必须等当前任务完成之后才能转到其他任务继续执行,而异步通过async与await等关键词,使程序(协程)在等待io或其他操作时可以被挂起,转而执行其他任务。这种使用协程的方法不用频繁切换进程,避免了CPU频繁切换上下文而造成的不必要的开销。

python中的异步编程:主要通过async与await关键字实现

  原函数:
  def function(time):
    print(f"executing---{time}")
    time.sleep(time)
  函数前加入async:
  async def function(time):
    print(f"executing---{time}")
    asyncio.sleep(time) #替换为非阻塞式,否则会直接阻塞协程
  if __name__=="__main__"():
    begain=time.time()
    t1=async asyncio.create_task(function(2))
    t2=async asyncio.create_task(function(3)) #创建协程,提交任务
    await t1
    await t2
    end=time.time()
    print(f"cost:{end-begain}") #显示任务耗费时间

可以从结果中得知使用async关键字时,任务所耗费的时间相比不使用有着明显的缩短。单个协程可以用asyncio.create_task(coro()),其作用为:

  • 把协程 coro() 包装成一个 Task;
  • 把 Task 注册到当前事件循环;
  • 立即返回 Task 对象,不会阻塞当前协程;
  • 之后可以用 await task 等它完成,也可以 task.cancel() 取消它。

多个协程可以用asyncio.gather()直接提交。

async def main_concurrent():
    await asyncio.gather(
        asyncio.sleep(1),
        asyncio.sleep(1),
        asyncio.sleep(1),
    ) #一次提交多个协程

使用asyncio.wait_for来控制超时

如果协程占用时间太长的话,会对整个进程的执行造成影响,此时就需要对协程进行超时控制。

  async def function(time):
    try:
      asyncio.wait_for:
        print(f"executing---{time}")
        asyncio.sleep(time)
        timeout=1.0 #超时时间
    catch asyncio.TimeoutError:
        print("task timeouterror") #需要添加超时错误处理
  if __name__=="__main__"():
    begain=time.time()
    t1=async asyncio.create_task(function(2))
    t2=async asyncio.create_task(function(3)) #创建协程,提交任务
    await t1
    await t2
    end=time.time()
    print(f"cost:{end-begain}") #显示任务耗费时间

目前对异步的了解还很浅薄,未来继续补充。

posted @ 2026-09-30 11:27  koer  阅读(3)  评论(0)    收藏  举报