首页 > 编程语言 >优雅简单玩转python3异步并发

优雅简单玩转python3异步并发

时间:2022-12-04 20:13:07浏览次数:36  
标签:异步 task run get await 玩转 loop async python3

在python3之后,随着async/await引入,异步调用以全新而便捷的方式让人眼前一亮。

首先,尽量用async/await定义协程

这里以使用aiohttp请求网络,async函数中,不要使用blocking io(比如requests,传统的mysql/redis库),否则仍然会阻塞全局。

下面的例子展示如何使用协程方式写一个http get请求

async def get_http(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            print("开始运行", url)
            js_str = await resp.text()
            print(len(js_str))

调用协程

  1. 调用协程并不会立刻得到返回的结果,如果想等待future/task的结果,使用await
  2. 如果想并发执行,并统一处理结果,使用loop.create_task,在创建任务的时候,任务就会执行
  3. task可await, 可先把创建的task保存,再统一await

下面的示例,将以并发调用5次baidu。且只使用一个线程。

async def get_https():
    loop = asyncio.get_event_loop()
    tasks = []
    for i in range(5):
        task = loop.create_task(get_http("http://www.baidu.com"))
        tasks.append(task)

    for task in tasks:
        await task

最后,在main函数执行并等待全部任务完成

async def run():
    await get_https()
loop = asyncio.get_event_loop()
loop.run_until_complete(run())

用其它可异步的IO(一般和网络相关)替换现有的blocking io的库,如aiomysql aioredis 以及其它以aio开头的库

时至今日,异步io库都已经覆盖主流框架和需求。

使用executor调用同步IO或cpu操作

这是一大创举,这个语法糖太香了。那就是使用loop.run_in_executor,让多线程操作与协程/任务模型无缝衔接起来。

这里举一个栗子,并发调用两次sleep

async def run():
    start = time.time()
    loop = asyncio.get_event_loop()
	
	# 第一个参数传None,使用默认的线程池,一般为5个线程,一般够用
	# 第二个参数是函数,而非函数的执行,这里与create_task不同,create_task传入的是 co(), 这里传入的是fn 没有括号执行。
    f1 = loop.run_in_executor(None, lambda: time.sleep(1))
    f2 = loop.run_in_executor(None, lambda: time.sleep(1))
    await f1 # 仍然可以用await关键字等待结果
    await f2
    # 耗时1s,说明两个sleep是并发执行的
    print(time.time()-start)

有了asyncio和loop,向以前的并发(线程)使用方式说拜拜吧。

标签:异步,task,run,get,await,玩转,loop,async,python3
From: https://www.cnblogs.com/superpigwin/p/16950566.html

相关文章

  • python3的re正则的简单使用
    importre#match----------------------------------------------------print(re.match(r'www','www.runoob.com').span())#(0,3)print(re.match('com','www.ru......
  • python3遇到的error
    SyntaxError:(unicodeerror)‘unicodeescape’codeccan’tdecodebytesinposition原始代码forxinos.listdir('C:\Users\Administrator\Desktop\files'):......
  • 玩转双指针
    一、算法简介双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。若两个指针指向同一数组,遍历方向相同且不会相交,则也称......
  • Springboot 使用 Async (内置线程池)执行异步任务(对比WebAsyncTask的使用)
    使用Async执行异步任务@SpringBootApplication@EnableAsyncpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Applicati......
  • SpringBoot集成DingTalk钉钉机器人实现消息同步/异步预警推送1.0版本
    V2.0版本新增支持以下功能新增Dinger层对消息对象配置指定钉钉机器人新增Dinger层统一管理消息对象,​​仅支持text和markdown格式​​支持xml方式配置支持注解方式配置新增......
  • guava异步增强-ListenableFuture
    jdk原生的future已经提供了异步操作,但是不能直接回调。guava对future进行了增强,核心接口就是ListenableFuture。如果已经开始使用了jdk8,可以直接学习使用原生的CompletableF......
  • 数据结构 玩转数据结构 6-13 更多二分搜索树相关话题
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13478 1重点关注1.1待解决的问题(持续深进)求某个节点的floor和ceil求某个节点的......
  • Python笔记-Python2和Python3兼容
    Python2与Python3在很数据类型、语法上面都有很大区别。为保证编写的脚本在Python2和Python3下兼容,需要在代码中做版本判断。示例代码如下:importsyspversion=int(s......
  • 科普扫盲|掌握这些命令,玩转Linux
    1.ls[选项][目录名|列出相关目录下的所有目录和文件 1-a列出包括.a开头的隐藏文件的所有文件2-A通-a,但不列出"."和".."3-l列出文件的详细信息4-c......
  • securecrt9使用Python3
     很长一段时间,securecrt支持python,但版本为python2,而且自带的python解释器模块有缺失,关键是不支持三方库,使用上不方便。securecrt9.0开始支持Python3,不像python2.7......