溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中單線程和異步協程工作方式的示例分析

發布時間:2021-08-12 14:58:03 來源:億速云 閱讀:127 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關python中單線程和異步協程工作方式的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

在python3.4之后新增了asyncio模塊,可以幫我們檢測IO(只能是網絡IO【HTTP連接就是網絡IO操作】),實現應用程序級別的切換(異步IO)。注意:asyncio只能發tcp級別的請求,不能發http協議。

 異步IO:所謂「異步 IO」,就是你發起一個 網絡IO 操作,卻不用等它結束,你可以繼續做其他事情,當它結束時,你會得到通知。

實現方式:單線程+協程實現異步IO操作。

異步協程用法

接下來讓我們來了解下協程的實現,從 Python 3.4 開始,Python 中加入了協程的概念,但這個版本的協程還是以生成器對象為基礎的,在 Python 3.5 則增加了 async/await,使得協程的實現更加方便。首先我們需要了解下面幾個概念:

  • event_loop:事件循環,相當于一個無限循環,我們可以把一些函數注冊到這個事件循環上,當滿足條件發生的時候,就會調用對應的處理方法。

  • coroutine:中文翻譯叫協程,在 Python 中常指代為協程對象類型,我們可以將協程對象注冊到時間循環中,它會被事件循環調用。我們可以使用 async 關鍵字來定義一個方法,這個方法在調用時不會立即被執行,而是返回一個協程對象。

  • task:任務,它是對協程對象的進一步封裝,包含了任務的各個狀態。

  • future:代表將來執行或沒有執行的任務的結果,實際上和 task 沒有本質區別。

另外我們還需要了解 async/await 關鍵字,它是從 Python 3.5 才出現的,專門用于定義協程。其中,async 定義一個協程,await 用來掛起阻塞方法的執行。

1.定義一個協程

示例:

from time import sleep
import asyncio

async def request(url):
  print('正在請求url')
  sleep(2)
  print('下載成功')

# 返回一個特殊的協程對象,request函數內部不會被執行
c = request('www.baidu.com')

# 實例化一個事件循環對象
loop = asyncio.get_event_loop()

# 基于事件循環對象創建一個任務對象,并將協程對象封裝到該對象中
task = loop.create_task(c)

# 另一種形式實例化任務對象的方法
task = asyncio.ensure_future(c)

# 將協程對象注冊到事件循環對象中,并需要啟動事件循環對象
# 當事件循環對象內的第一個參數遇到阻塞是,就會自動執行后面的對象,當第一個對象的阻塞結束是會上報給事件循環對象,然后事件循環對象繼續執行第一個對象,從而達到異步的效果
loop.run_until_complete(task)

2.給任務對象綁定回調

import asyncio

async def request(url):
  print('正在請求url')
  print('下載成功')
  return url

# 回調函數必須有一個參數:task【任務對象】
# task.result():任務對象中封裝的協程對象對應的特殊函數內部的返回值
def callback(task):
  print('this is callback')
  print(task.result())

c = request('www.baidu.com')
# 創建一個任務對象
task = asyncio.ensure_future(c)
# 給任務對象綁定一個回調函數
task.add_done_callback(callback)
# 實例化一個事件循環對象
loop = asyncio.get_event_loop()
# 將協程對象注冊到事件循環對象中,并需要啟動事件循環對象
loop.run_until_complete(task)

3.多任務異步協程

import asyncio
import time

urls = ['www.baidu.com','www.sogou,com','www.goubanjia.com']
start_time = time.time()
async def request(url):
  print('正在請求url')
  # 在多任務異步協程事項中,不可以出現不支持異步的相關代碼,sleep不支持
  # sleep(2)
  await asyncio.sleep(2)
  print('下載成功')

loop = asyncio.get_event_loop()
# 任務列表:防止多個任務對象
tasks = []
for url in urls:
  c = request(url)
  task = asyncio.ensure_future(c)
  tasks.append(task)

loop.run_until_complete(asyncio.wait(tasks))
print(time.time() - start_time)

4.多異步任務協程應用

# aiohttp:支持異步的一個基于網絡請求的模塊
import aiohttp
import asyncio
import time

urls = ['http://127.0.0.1:5000/jay',
    'http://127.0.0.1:5000/bobo',
    'http://127.0.0.1:5000/tom',]

start_time = time.time()

async def get_pageText(url):
  async with aiohttp.ClientSession() as s:# 實例化請求對象
    async with await s.get(url) as response:
      page_text = await response.text()
      print(page_text)
      # 這里有返回值,是因為要用回調函數進行數據解析
      return page_text

# 封裝回調函數用于數據解析
def parse(task):
  # 1.獲取相應數據
  page_text = task.reault()
  print(page_text+',即將進行數據解析...')
  # 以下解析操作


tasks = []
for url in urls:
  c = get_pageText(url)
  task = asyncio.ensure_future(c)
  # 給任務對象綁定回調函數用于數據解析
  task.add_done_callback(parse)
  tasks.append(task)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print(time.time() - start_time)

關于“python中單線程和異步協程工作方式的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女