范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

python异步编程之asyncio(百万并发)

  前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病。然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板,如最新的微服务框架japronto,resquests per second可达百万级。
  python还有一个优势是库(第三方库)极为丰富,运用十分方便。asyncio是python3.4版本引入到标准库,python2x没有加这个库,毕竟python3x才是未来啊,哈哈!python3.5又加入了async/await特性。
  在学习asyncio之前,我们先来理清楚 同步/异步的概念 :
  ·同步 是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行…
  ·异步 是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态、通知、回调来通知调用者处理结果。
  一、asyncio
  下面通过举例来对比 同步代码和异步代码编写方面的差异 ,其次看下两者性能上的差距,我们使用sleep(1)模拟耗时1秒的io操作。
  ·同步代码 : import time  def hello():     time.sleep(1)  def run():     for i in range(5):         hello()         print("Hello World:%s" % time.time())  # 任何伟大的代码都是从Hello World 开始的! if __name__ == "__main__":     run()
  输出:(间隔约是1s) import time  def hello():     time.sleep(1)  def run():     for i in range(5):         hello()         print("Hello World:%s" % time.time())  # 任何伟大的代码都是从Hello World 开始的! if __name__ == "__main__":     run()
  ·异步代码 : import time import asyncio  # 定义异步函数 async def hello():     await asyncio.sleep(1)     print("Hello World:%s" % time.time())  if __name__ =="__main__":     loop = asyncio.get_event_loop()     tasks = [hello() for i in range(5)]     loop.run_until_complete(asyncio.wait(tasks))
  输出: Hello World:1527595104.8338501 Hello World:1527595104.8338501 Hello World:1527595104.8338501 Hello World:1527595104.8338501 Hello World:1527595104.8338501async def 用来定义异步函数,await 表示当前协程任务等待睡眠时间,允许其他任务运行。然后获得一个事件循环,主线程调用asyncio.get_event_loop()时会创建事件循环,你需要把异步的任务丢给这个循环的run_until_complete()方法,事件循环会安排协同程序的执行。 二、aiohttp
  如果需要并发http请求怎么办呢,通常是用requests,但requests是同步的库,如果想异步的话需要引入aiohttp。 这里引入一个类,from aiohttp import ClientSession,首先要建立一个session对象,然后用session对象去打开网页 。session可以进行多项操作,比如post, get, put, head等。
  基本用法: async with ClientSession() as session:     async with session.get(url) as response:
  aiohttp异步实现的例子: import asyncio from aiohttp import ClientSession   tasks = [] url = "https://www.baidu.com/{}" async def hello(url):     async with ClientSession() as session:         async with session.get(url) as response:             response = await response.read()             print(response)  if __name__ == "__main__":     loop = asyncio.get_event_loop()     loop.run_until_complete(hello(url))
  首先async def 关键字定义了这是个异步函数,await 关键字加在需要等待的操作前面,response.read()等待request响应,是个耗IO操作。然后使用ClientSession类发起http请求。
  多链接异步访问
  如果我们需要请求多个URL该怎么办呢,同步的做法访问多个URL只需要加个for循环就可以了。但异步的实现方式并没那么容易, 在之前的基础上需要将hello()包装在asyncio的Future对象中,然后将Future对象列表作为任务传递给事件循环 。 import time import asyncio from aiohttp import ClientSession  tasks = [] url = "https://www.baidu.com/{}" async def hello(url):     async with ClientSession() as session:         async with session.get(url) as response:             response = await response.read() #            print(response)             print("Hello World:%s" % time.time())  def run():     for i in range(5):         task = asyncio.ensure_future(hello(url.format(i)))         tasks.append(task)   if __name__ == "__main__":     loop = asyncio.get_event_loop()     run()     loop.run_until_complete(asyncio.wait(tasks))
  输出: Hello World:1527754874.8915546 Hello World:1527754874.899039 Hello World:1527754874.90004 Hello World:1527754874.9095392 Hello World:1527754874.9190395
  收集http响应
  好了,上面介绍了访问不同链接的异步实现方式,但是我们只是发出了请求,如果要把响应一一收集到一个列表中,最后保存到本地或者打印出来要怎么实现呢, 可通过asyncio.gather(*tasks)将响应全部收集起来 ,具体通过下面实例来演示。 import time import asyncio from aiohttp import ClientSession  tasks = [] url = "https://www.baidu.com/{}" async def hello(url):     async with ClientSession() as session:         async with session.get(url) as response: #            print(response)             print("Hello World:%s" % time.time())             return await response.read()  def run():     for i in range(5):         task = asyncio.ensure_future(hello(url.format(i)))         tasks.append(task)     result = loop.run_until_complete(asyncio.gather(*tasks))     print(result)  if __name__ == "__main__":     loop = asyncio.get_event_loop()     run()
  输出: Hello World:1527765369.0785167 Hello World:1527765369.0845182 Hello World:1527765369.0910277 Hello World:1527765369.0920424 Hello World:1527765369.097017 [b"r r r r ......
  异常解决
  假如你的并发达到2000个,程序会报错:ValueError: too many file descriptors in select()。报错的原因字面上看是 Python 调取的 select 对打开的文件有最大数量的限制,这个其实是操作系统的限制,linux打开文件的最大数默认是1024,windows默认是509,超过了这个值,程序就开始报错。这里我们有 三种方法解决 这个问题:
  1.限制并发数量 。(一次不要塞那么多任务,或者限制最大并发数量)
  2.使用回调的方式 。
  3.修改操作系统打开文件数的最大限制,在系统里有个配置文件可以修改默认值,具体步骤不再说明了。
  不修改系统默认配置的话,个人推荐限制并发数的方法,设置并发数为500,处理速度更快。 #coding:utf-8 import time,asyncio,aiohttp   url = "https://www.baidu.com/" async def hello(url,semaphore):     async with semaphore:         async with aiohttp.ClientSession() as session:             async with session.get(url) as response:                 return await response.read()   async def run():     semaphore = asyncio.Semaphore(500) # 限制并发量为500     to_get = [hello(url.format(),semaphore) for _ in range(1000)] #总共1000任务     await asyncio.wait(to_get)   if __name__ == "__main__": #    now=lambda :time.time()     loop = asyncio.get_event_loop()     loop.run_until_complete(run())     loop.close()

华为能否彻底离开美国技术?注意是美国技术?除非说你准备回到原始社会,要不然的话,谁都不能彻底离开美国技术。别的不说了,就说咱们日常中需要用到的电吧!咱们用的电,不是交流电就是直流电,但无论是交流电还是直流电,其技术发明者都iPhone13的卫星功能只会在部分特定市场上提供上周,分析师郭明錤表示,苹果将在iPhone13上支持LEO卫星通信,然后,彭博社的MarkGurman给出了更多关于这一功能及其实现的细节。现在,在他的PowerOn时事通讯中,元宇宙这场美梦,万一实现了呢?布道者2014年,扎克伯格试用Rift原型机后没再犹豫,用股权凑齐20亿美金收购了提供商Oculus7年后,张一鸣挥手90亿收购VR头盔提供商PICO,宣布字节入局与字节竞价失败的宇宙中的物质从哪里来?宇宙中的恒星宇宙是时间空间物质与能量的集合体。宇宙由68的暗能量27的暗物质和5的可见物质组成。现在宇宙中有上千亿个星系,每个星系又有1000亿至4000亿颗恒星,可以形象地说,地假如太阳停止发光发热,人类的时间就只剩下八分钟了吗?如果太阳突然停止发光发热,地球上的人类会在大约8分20秒后才会感知到。地球与太阳的间相隔为一个天文单位,其具体的距离大约为15000万公里,而光在真空中的传播速度大约30万公里秒。人死后48小时内会有哪些变化?活着的时候,人一辈子都在为自己打算,出门穿什么衣服,午饭吃什么,晚上去哪里玩,要买什么样的房子车子,过什么样的生活。那当人体死亡后,你会面临什么,很少有人关注。人们常说的一句话就是如果一个人尿在通电的插排上,会不会触电而亡?如果一个人尿在通电的插排上,会不会被电死?男生尿尿都喜欢瞄准一个物体尿尿,所以就发生了有趣的故事,记得某次看过一个非常有趣的事情,说的是某学校的学生都都喜欢对着隔壁公司的一根自来水该如何解释美国专家质疑阿波罗11登月真实性这件事?假的真不了。那些质疑者提出的疑问都极具科学性和常识性,而那些保真的人回答都莫衷一是,模棱两可的胡言乱语。总的来说,质疑者证据确凿,思维清晰,言语有力。而那些认定美国登月是真的那群人你手机里有哪些堪称神器的App?1。日程管理时光序支持根据艾宾浩斯遗忘曲线设置日程,被家长学生誉为辅助学习超级功能。学习某个知识点后,可自动按照1天2天4天7天15天的规律生成日程,然后再桌面日期界面显示。科学学听说华强北有人在二手iPhone里安装监控芯片,请问是真的吗?像你这种银行卡余额3。8元的,他监控你干啥你给我说说假的,首先,监控个电压什么的还可信,但是监控IOS这样的操作系统,并不是一个芯片就能解决的,它首先需要几个要素,最重要的是芯片,平时在家里听听音乐,不是发烧级别的,哪个牌子的音箱比较好?本人购买过很多音响,在这发表点意见,仅供参考,如有不同意见欢迎指正。关于购买音响,我的建议是你要去听,一般好点的品牌都可以试听的。可以让音响店老板给你放些试音音乐,比如加州旅馆,渡
科技圈传来了爆炸性消息,中国巨头成功发布了神机!今天说说感受随着一年一度的iphone13的到来,随后中国科技巨头也迎来了新品发布,并在昨天发布了新品civi。此次,小米Civi是一款以女性为主的一款轻薄手机,但小米Civi里面蕴藏的多种黑大快人心!一中国科技巨头成功发布了新的战略!美媒一定要阻止近几年来,西方国家对于中国芯片都有着极低的评价,虽然我们不愿意接受,但事实就是这样,我国芯片在技术方面还是跟西方国家还是有一定的差距!据每年消息显示,我国拥有世界上最大的电子产品市999元学生党主机搭配(下)硬盘除非同学有几个T的学习资料啊,可以选择机械硬盘,否则作为一个臭打游戏党必选固态硬盘啊,至于m。2就不考虑了,还是老老实实选择SATA硬盘240g也就150左右,读取速度也还行,3000价位里最能打的安卓机那必须是它啊在今年的618中,小米家族杀出了一匹黑马,它既不是万众瞩目的旗舰担当小米11,也不是堪称性价比之王的红米K40。小米10s的异军突起,一举成为3000价位里销量最高的旗舰。小米10应对冷数据存储挑战,西部数据助力UCloud推出新一代归档存储产品数据已经成为企业的核心资产。而在企业数据的冰山模型里,80的数据量来源于冷数据。时下,对冷数据进行归档存储是通行的解决方案。可现实的矛盾在于,归档存储的成本和可靠性依然是企业主要的音乐世家携手金嗓子与FyneAudio,带来曼妙的音乐体验2020年10月23日,在新一届的SIAV2020上海展会上,音乐世家本着为中国的音响爱好者带来优质的音响器材及软件的初衷,携同日本Accuphase(金嗓子),英国FyneAud通达OA办公系统标准解决方案通达OA网络办公系统方案目录1产品综述32项目概述53项目目标64网络部署环境85智能门户可定制96开放性可集成多系统137公文管理148流程中心定制业务流程管理189应用中心可按游戏融入生活,宜家携手ROG玩家国度全球首发电竞家居产品在全球电子游戏行业蓬勃发展电竞进入爆发期的今天,全球知名家具及家居用品零售商宜家携手ROG玩家国度,推出针对中国及全球游戏玩家的电竞家具及家居产品系列,借助双方在家居生活及游戏领域真我探索不可能今天下午两点,realme真我GTNeo2新品发布会如期举行,realme真我GTNeo2也正式亮相,realme真我其实一直都在闷声干大事,立志成为打游戏最稳的主力机。今天介绍给安卓新机越来越强,iPhone13是要凉凉?明天凌晨,iPhone13系列就要发布了,随着发布时间越来越近,网络上各种千奇百怪的小道消息也被曝光。不过这次爆出来的苹果官方保护壳也算实锤了iPhone13的摄像头是对角线排列,5G千元机,非它莫属OPPO今年在发布了主打旗舰体验的FindX系列和中高端的Reno系列外,在品牌总体销量中占据重要组成部分的A系列,同样表现得非常活跃。上半年以来,OPPO已经发布几款A系列机型,