首页 > 其他分享 >异步协程

异步协程

时间:2024-10-14 19:48:15浏览次数:7  
标签:异步 协程 await 任务 async asyncio

协程,线程和进程的区别

  • 多线程:多进程通常利用的是多核 CPU 的优势,同时执行多个计算任务。每个进程有自己独立的内存管理,所以不同进程之间要进行数据通信比较麻烦。

  • 多线程:多线程是在一个 cpu 上创建多个子任务,当某一个子任务休息的时候其他任务接着执行。多线程的控制是由 python 自己控制的。 子线程之间的内存是共享的,并不需要额外的数据通信机制。但是线程存在数据同步问题,所以要有锁机制。

  • 多协程:协程的实现是在一个线程内实现的,相当于流水线作业。协程是一个线程中执行,没有线程切换的开销,所以对于并发编程,可以优先使用协程。

asyncio

在Python的asyncio库中,asyncawait是用于异步编程的关键字,引入了异步/协程(coroutine)的概念

异步编程是一种处理并发任务的方式,使得程序能够在等待某些I/O操作(如文件读写、网络请求等)的同时继续执行其他任务,而不会发生阻塞。作用:

  • 提高程序效率:异步编程可以充分利用I/O等待时间,使得程序在等待操作完成时能够继续执行其他任务,从而提高了整体程序的效率。

  • 改善用户体验:在网络编程中,异步操作可以避免阻塞用户界面,使得应用程序更加流畅。

  • 简化并发编程:通过使用async和await关键字,可以更方便地编写并发程序,避免了传统多线程编程中的锁和同步问题。

用法:

  1. 定义异步函数,使用async关键字

  2. 在异步函数中,使用await 关键字执行可等待对象(Coroutine、Task、Future),等待子函数执行完成,再往下执行。(在并发操作中,把程序控制权教给主程序,让他分配其他协程执行。) await 只能在带有 async 关键字的函数中运行。

  3. 通过 asyncio.create_task() / asyncio.gather() 创建任务

  4. asyncio.run 运行任务

# 定义异步函数
async def fetch_data(index):
   print(f"Fetching data {index}...")
   await asyncio.sleep(2)  # 模拟网络请求
   print(f"Data {index} fetched.")
   return f"Data {index}"

async def main():
   tasks = [fetch_data(i) for i in range(2)]
   results = await asyncio.gather(*tasks)
   print("All data fetched:", results)

# 执行任务
asyncio.run(main())
  • asyncio.create_task() 用于创建一个协程任务,接受一个协程对象作为参数,并返回一个任务对象,该任务对象可以用来控制和管理该协程的执行,包括取消、等待其执行完成等

  • asyncio.gather() 用于同时运行多个协程,并等待全部完成。接受一系列的协程对象(或者 Future 对象)作为参数,并返回一个协程对象,该协程对象会在所有给定的协程都执行完毕后完成

  • asyncio.run 函数运行协程程序,协程函数作为参数传入

在一个async函数内部,通过await可以调用另一个async函数,这个调用看起来是串行执行的,但实际上是由asyncio内部的消息循环控制;

在一个async函数内部,通过await asyncio.gather()可以并发执行若干个async函数。

标签:异步,协程,await,任务,async,asyncio
From: https://www.cnblogs.com/yjh1995/p/18464893

相关文章

  • 深入理解 JavaScript 异步:掌握 Promise、Async/Await 与 Promise.all 全指南
    博文:深入理解JavaScript中的Promise、await、.then()和Promise.all()在现代JavaScript中,处理异步操作时,Promise、async/await和Promise.all()是关键工具。本文将深入讲解它们的用法及实现,并结合实际例子。1.Promise的基本使用Promise是一种处理异步操作的方式。......
  • C++异步调用 future async promise packaged_task
    背景:C++异步调用是现代C++编程中的一种重要技术,它允许程序在等待某个任务完成时继续执行其他代码,从而提高程序的效率和响应性。C++11引入了std::async、std::future和std::promise等工具,使得异步编程变得更加方便和直观。以下是关于C++异步调用的详细介绍,包括基本概......
  • Spring 实现 3 种异步流式接口,干掉接口超时烦恼
    大家好,我是小富~如何处理比较耗时的接口?这题我熟,直接上异步接口,使用Callable、WebAsyncTask和DeferredResult、CompletableFuture等均可实现。但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地向客户端响应处理结果,这些方法就不......
  • django异步情况下执行orm操作
    importasynciofromchannels.dbimportdatabase_sync_to_asyncfrom.modelsimportConversationclassLlmConsumer(AsyncWebsocketConsumer):def__init__(self,*args,**kwargs):super().__init__(args,kwargs)self.chat_id=None......
  • JS异步编程精通之路(一):Callback、Promise、Async/Await 和 Observable 深度对比
    在现代JavaScript编程中,异步操作是常见且必不可少的部分。处理异步的方式多种多样,其中最常见的有Callback、Promise、Async/Await,以及近年来随着响应式编程(ReactiveProgramming)理念兴起的Observable。本文将对这几种异步处理方式进行对比,帮助你理解它们各自的优缺点,以......
  • golang实现分段协程数据查询、任务处理
    使用背景我们经常遇到需要同时执行耗时的IO请求或数据处理等场景,需要用到协程来达到高效率,但又需要控制协程执行过程的量,防止资源过载,让效率和资源达到最优状态,这就是分段执行的价值。一般实现的方式主要有两种:1、需要获取执行结果,在协程内将执行结果写入chan,并在分段创......
  • 使用Python异步抓取豆瓣电影数据并进行可视化
    一前言在本篇文章中,我们将探讨如何使用Python的asyncio和aiohttp库来异步抓取豆瓣电影Top250中的电影数据,并将这些数据保存到CSV文件中,最后使用matplotlib库对评分趋势进行可视化。目标网站:https://movie.douban.com/top250二环境准备首先确保你的环境中已经安装了......
  • RabbitMQ 入门(一)同步通讯和异步通讯
    一、同步通讯和异步通讯微服务间通讯有同步和异步两种方式:一)、同步通讯我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:同步调用的优点:-时效性较强,可以立即得到结果同步调用的问题:-耦合度高:每次加入新的需求,都要修改原来的代码;-性能......
  • Web前端高级工程师培训:异步处理专题
    异步处理专题课前准备工具编辑器VSCode浏览器Chorme前置知识ES6基础语法课堂主题同步及异步概念方块运动的实现promise的用法then的返还值Async函数和await课堂目标理解并学会使用promise使用方式以及async、await的使用同步异步概念js是单线程单......
  • JavaScript 异步编程入门
    最近开始不断学习实践JavaScript,出于性能测试的敏感,首先研究了JavaScript的异步编程实践,目前看跟之前学过的Java和Go都不太一样。使用的语法上相对更加复杂,也可能因为我实践得还太少。异步编程异步编程是一种在程序执行过程中,不阻塞主线程的任务处理方式。相较于同步编程......