国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

詳解python異步編程之a(chǎn)syncio(百萬(wàn)并發(fā))

2020-02-15 22:13:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言:python由于GIL(全局鎖)的存在,不能發(fā)揮多核的優(yōu)勢(shì),其性能一直飽受詬病。然而在IO密集型的網(wǎng)絡(luò)編程里,異步處理比同步處理能提升成百上千倍的效率,彌補(bǔ)了python性能方面的短板,如最新的微服務(wù)框架japronto,resquests per second可達(dá)百萬(wàn)級(jí)。

python還有一個(gè)優(yōu)勢(shì)是庫(kù)(第三方庫(kù))極為豐富,運(yùn)用十分方便。asyncio是python3.4版本引入到標(biāo)準(zhǔn)庫(kù),python2x沒有加這個(gè)庫(kù),畢竟python3x才是未來(lái)啊,哈哈!python3.5又加入了async/await特性。

在學(xué)習(xí)asyncio之前,我們先來(lái)理清楚同步/異步的概念:

同步是指完成事務(wù)的邏輯,先執(zhí)行第一個(gè)事務(wù),如果阻塞了,會(huì)一直等待,直到這個(gè)事務(wù)完成,再執(zhí)行第二個(gè)事務(wù),順序執(zhí)行。。。

異步是和同步相對(duì)的,異步是指在處理調(diào)用這個(gè)事務(wù)的之后,不會(huì)等待這個(gè)事務(wù)的處理結(jié)果,直接處理第二個(gè)事務(wù)去了,通過狀態(tài)、通知、回調(diào)來(lái)通知調(diào)用者處理結(jié)果。

一、asyncio

下面通過舉例來(lái)對(duì)比同步代碼和異步代碼編寫方面的差異,其次看下兩者性能上的差距,我們使用sleep(1)模擬耗時(shí)1秒的io操作。

同步代碼:

import timedef 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)

Hello World:1527595175.4728756
Hello World:1527595176.473001
Hello World:1527595177.473494
Hello World:1527595178.4739306
Hello World:1527595179.474482 

異步代碼:

import timeimport asyncio# 定義異步函數(shù)async def hello():  asyncio.sleep(1)  print('Hello World:%s' % time.time())def run():  for i in range(5):    loop.run_until_complete(hello())loop = asyncio.get_event_loop()if __name__ =='__main__':  run() 

輸出:

Hello World:1527595104.8338501
Hello World:1527595104.8338501
Hello World:1527595104.8338501
Hello World:1527595104.8338501
Hello World:1527595104.8338501 

async def 用來(lái)定義異步函數(shù),其內(nèi)部有異步操作。每個(gè)線程有一個(gè)事件循環(huán),主線程調(diào)用asyncio.get_event_loop()時(shí)會(huì)創(chuàng)建事件循環(huán),你需要把異步的任務(wù)丟給這個(gè)循環(huán)的run_until_complete()方法,事件循環(huán)會(huì)安排協(xié)同程序的執(zhí)行。  

二、aiohttp

如果需要并發(fā)http請(qǐng)求怎么辦呢,通常是用requests,但requests是同步的庫(kù),如果想異步的話需要引入aiohttp。這里引入一個(gè)類,from aiohttp import ClientSession,首先要建立一個(gè)session對(duì)象,然后用session對(duì)象去打開網(wǎng)頁(yè)。session可以進(jìn)行多項(xiàng)操作,比如post, get, put, head等。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昭通市| 铁岭县| 彰武县| 大田县| 上饶县| 乳山市| 新丰县| 临猗县| 峡江县| 杨浦区| 金塔县| 咸阳市| 朝阳市| 南涧| 耿马| 虹口区| 潮安县| 南康市| 芜湖市| 宽甸| 平舆县| 大庆市| 平湖市| 通州市| 南靖县| 麟游县| 六枝特区| 镇赉县| 洛川县| 凤翔县| 平安县| 于都县| 松江区| 永平县| 友谊县| 榕江县| 五河县| 石狮市| 七台河市| 桂林市| 博客|