最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 異步async庫的使用說明

 更新時間:2020年05月04日 17:50:48   作者:brucewong0516  
這篇文章主要介紹了python 異步async庫的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

asyncio函數(shù):

異步IO采用消息循環(huán)的模式,重復(fù)“讀取消息—處理消息”的過程,也就是說異步IO模型”需要一個消息循環(huán),在消息循環(huán)中,主線程不斷地重復(fù)“讀取消息-處理消息”這一過程。

event_loop 事件循環(huán):程序開啟一個無限的循環(huán),程序員會把一些函數(shù)注冊到事件循環(huán)上。當(dāng)滿足事件發(fā)生的時候,調(diào)用相應(yīng)的協(xié)程函數(shù)。

coroutine 協(xié)程:協(xié)程對象,指一個使用async關(guān)鍵字定義的函數(shù),它的調(diào)用不會立即執(zhí)行函數(shù),而是會返回一個協(xié)程對象。協(xié)程對象需要注冊到事件循環(huán),由事件循環(huán)調(diào)用。

task 任務(wù):一個協(xié)程對象就是一個原生可以掛起的函數(shù),任務(wù)則是對協(xié)程進一步封裝,其中包含任務(wù)的各種狀態(tài)。

async/await 關(guān)鍵字: 用于定義協(xié)程的關(guān)鍵字,async定義一個協(xié)程,await用于掛起阻塞的異步調(diào)用接口。

一、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()) 
if __name__ == '__main__':
  run()

Hello World:1536842494.2786784
Hello World:1536842495.2796268
Hello World:1536842496.2802596
Hello World:1536842497.2804587
Hello World:1536842498.2812462

異步代碼:

import time
import asyncio

# 定義異步函數(shù)
async def hello():
  print('Hello World:%s' % time.time())
  #必須使用await,不能使用yield from;如果是使用yield from ,需要采用@asyncio.coroutine相對應(yīng)
  await asyncio.sleep(1)  
  print('Hello wow World:%s' % time.time())

def run():
  tasks = []
  for i in range(5):
    tasks.append(hello())
  loop.run_until_complete(asyncio.wait(tasks))

loop = asyncio.get_event_loop()
if __name__ =='__main__':
  run()

Hello World:1536855050.1950748
Hello World:1536855050.1950748
Hello World:1536855050.1950748
Hello World:1536855050.1960726
Hello World:1536855050.1960726
(暫停約1秒)
Hello wow World:1536855051.1993241
Hello wow World:1536855051.1993241
Hello wow World:1536855051.1993241
Hello wow World:1536855051.1993241
Hello wow World:1536855051.1993241

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

上述程序中,hello()會首先打印出Hello world!,然后,yield from語法可以讓我們方便地調(diào)用另一個generator。

由于await asyncio.sleep(1)也是一個coroutine,所以線程不會等待asyncio.sleep(1),而是直接中斷并執(zhí)行下一個消息循環(huán)。

當(dāng)asyncio.sleep(1)返回時,線程就可以從yield from拿到返回值(此處是None),然后接著執(zhí)行下一行語句。

把asyncio.sleep(1)看成是一個耗時1秒的IO操作,在此期間,主線程并未等待,而是去執(zhí)行EventLoop中其他可以執(zhí)行的coroutine了,因此可以實現(xiàn)并發(fā)執(zhí)行。

asyncio操作的總結(jié):

async def hello(): 定義async異步函數(shù),中間可以添加await async.sleep(N) 來設(shè)定中斷并執(zhí)行下一個循環(huán)消息

tasks = [] 任務(wù)則是對協(xié)程進一步封裝,其中包含任務(wù)的各種狀態(tài)。即多個coroutine函數(shù)可以封裝成一組Task然后并發(fā)執(zhí)行

loop = asyncio.get_event_loop() #獲取“事件循環(huán)”對象

loop.run_until_complete(asyncio.wait(tasks)) #通過事件循環(huán),去調(diào)用協(xié)程函數(shù)

loop.close() 結(jié)束時間循環(huán)

二、aiohttp   

如果需要并發(fā)http請求,通常是用requests,但requests是同步的庫,如果想異步的話需要引入aiohttp。

這里引入一個類,from aiohttp import ClientSession,首先要建立一個session對象,然后用session對象去打開網(wǎng)頁。

session可以進行多項操作,比如post, get, put, head等。

基本用法:

async with ClientSession() as session:

async with session.get(url) as response:

aiohttp異步實現(xiàn)的例子:

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 關(guān)鍵字定義了這是個異步函數(shù),await 關(guān)鍵字加在需要等待的操作前面,response.read()等待request響應(yīng),是個耗IO操作。然后使用ClientSession類發(fā)起http請求。

多鏈接異步訪問

如果我們需要請求多個URL該怎么辦呢,同步的做法訪問多個URL只需要加個for循環(huán)就可以了。但異步的實現(xiàn)方式并沒那么容易,在之前的基礎(chǔ)上需要將hello()包裝在asyncio的Future對象中,然后將Future對象列表作為任務(wù)傳遞給事件循環(huán)。

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('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:1536843566.064149
Hello World:1536843566.070586
Hello World:1536843566.0769563
Hello World:1536843566.0779328
Hello World:1536843566.0799286

·收集http響應(yīng)

好了,上面介紹了訪問不同鏈接的異步實現(xiàn)方式,但是我們只是發(fā)出了請求,如果要把響應(yīng)一一收集到一個列表中,最后保存到本地或者打印出來要怎么實現(xiàn)呢,可通過asyncio.gather(*tasks)將響應(yīng)全部收集起來

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:1536843488.678779
Hello World:1536843488.6797836
Hello World:1536843488.6867576
Hello World:1536843488.6877556
Hello World:1536843488.6877556

以上這篇python 異步async庫的使用說明就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python 刪除系統(tǒng)中的文件(按時間,大小,擴展名)

    python 刪除系統(tǒng)中的文件(按時間,大小,擴展名)

    這篇文章主要介紹了python 如何刪除系統(tǒng)中的文件,分別按時間,大小,擴展名刪除,滿足不同需求,感興趣的朋友可以了解下
    2020-11-11
  • Python使用正則表達式過濾或替換HTML標(biāo)簽的方法詳解

    Python使用正則表達式過濾或替換HTML標(biāo)簽的方法詳解

    這篇文章主要介紹了Python使用正則表達式過濾或替換HTML標(biāo)簽的方法,簡單介紹了Python正則相關(guān)語法并結(jié)合具體實例形式分析了Python基于正則表達式的HTML標(biāo)簽過濾與替換相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • python transpose()處理高維度數(shù)組的軸變換的實現(xiàn)

    python transpose()處理高維度數(shù)組的軸變換的實現(xiàn)

    本文主要介紹了python transpose()處理高維度數(shù)組的軸變換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Python shutil模塊實現(xiàn)文件的裁剪、壓縮與解壓縮的方法

    Python shutil模塊實現(xiàn)文件的裁剪、壓縮與解壓縮的方法

    這篇文章主要介紹了Python shutil模塊實現(xiàn)文件的裁剪、壓縮與解壓縮的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • 用Python替換證件照背景顏色

    用Python替換證件照背景顏色

    大家好,本篇文章主要講的是用Python替換證件照背景顏色,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 解讀requests.session()獲取Cookies全過程

    解讀requests.session()獲取Cookies全過程

    這篇文章主要介紹了解讀requests.session()獲取Cookies全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 解決Pytorch 加載訓(xùn)練好的模型 遇到的error問題

    解決Pytorch 加載訓(xùn)練好的模型 遇到的error問題

    今天小編就為大家分享一篇解決Pytorch 加載訓(xùn)練好的模型 遇到的error問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python和anaconda區(qū)別以及先后安裝的問題詳解

    python和anaconda區(qū)別以及先后安裝的問題詳解

    Anaconda(開源的Python包管理器)是一個python發(fā)行版,包含了conda、Python等180多個科學(xué)包及其依賴項,下面這篇文章主要給大家介紹了關(guān)于python和anaconda區(qū)別以及先后安裝問題的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Pytho樹的直徑的計算實現(xiàn)

    Pytho樹的直徑的計算實現(xiàn)

    樹的直徑是樹中任意兩個節(jié)點之間最長路徑的長度,本文主要介紹了Pytho樹的直徑的計算實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Pytest如何使用skip跳過執(zhí)行測試

    Pytest如何使用skip跳過執(zhí)行測試

    這篇文章主要介紹了Pytest如何使用skip跳過執(zhí)行測試,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論

霍林郭勒市| 仁怀市| 汽车| 昌都县| 滨海县| 杂多县| 讷河市| 海城市| 桓台县| 九龙县| 高台县| 清镇市| 济阳县| 东城区| 贺州市| 溧阳市| 金门县| 苍溪县| 德昌县| 绥阳县| 海林市| 吉木乃县| 六安市| 长泰县| 教育| 扶绥县| 丽江市| 华安县| 贞丰县| 乌兰浩特市| 读书| 彰武县| 江门市| 囊谦县| 夏河县| 西乌| 临猗县| 莎车县| 津南区| 罗平县| 石渠县|