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

python 單線程和異步協(xié)程工作方式解析

 更新時(shí)間:2019年09月28日 09:24:54   作者:陪伴is最長(zhǎng)情的告白  
這篇文章主要介紹了python 單線程和異步協(xié)程工作方式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

在python3.4之后新增了asyncio模塊,可以幫我們檢測(cè)IO(只能是網(wǎng)絡(luò)IO【HTTP連接就是網(wǎng)絡(luò)IO操作】),實(shí)現(xiàn)應(yīng)用程序級(jí)別的切換(異步IO)。注意:asyncio只能發(fā)tcp級(jí)別的請(qǐng)求,不能發(fā)http協(xié)議。

 異步IO:所謂「異步 IO」,就是你發(fā)起一個(gè) 網(wǎng)絡(luò)IO 操作,卻不用等它結(jié)束,你可以繼續(xù)做其他事情,當(dāng)它結(jié)束時(shí),你會(huì)得到通知。

實(shí)現(xiàn)方式:?jiǎn)尉€程+協(xié)程實(shí)現(xiàn)異步IO操作。

異步協(xié)程用法

接下來(lái)讓我們來(lái)了解下協(xié)程的實(shí)現(xiàn),從 Python 3.4 開(kāi)始,Python 中加入了協(xié)程的概念,但這個(gè)版本的協(xié)程還是以生成器對(duì)象為基礎(chǔ)的,在 Python 3.5 則增加了 async/await,使得協(xié)程的實(shí)現(xiàn)更加方便。首先我們需要了解下面幾個(gè)概念:

  • event_loop:事件循環(huán),相當(dāng)于一個(gè)無(wú)限循環(huán),我們可以把一些函數(shù)注冊(cè)到這個(gè)事件循環(huán)上,當(dāng)滿(mǎn)足條件發(fā)生的時(shí)候,就會(huì)調(diào)用對(duì)應(yīng)的處理方法。
  • coroutine:中文翻譯叫協(xié)程,在 Python 中常指代為協(xié)程對(duì)象類(lèi)型,我們可以將協(xié)程對(duì)象注冊(cè)到時(shí)間循環(huán)中,它會(huì)被事件循環(huán)調(diào)用。我們可以使用 async 關(guān)鍵字來(lái)定義一個(gè)方法,這個(gè)方法在調(diào)用時(shí)不會(huì)立即被執(zhí)行,而是返回一個(gè)協(xié)程對(duì)象。
  • task:任務(wù),它是對(duì)協(xié)程對(duì)象的進(jìn)一步封裝,包含了任務(wù)的各個(gè)狀態(tài)。
  • future:代表將來(lái)執(zhí)行或沒(méi)有執(zhí)行的任務(wù)的結(jié)果,實(shí)際上和 task 沒(méi)有本質(zhì)區(qū)別。

另外我們還需要了解 async/await 關(guān)鍵字,它是從 Python 3.5 才出現(xiàn)的,專(zhuān)門(mén)用于定義協(xié)程。其中,async 定義一個(gè)協(xié)程,await 用來(lái)掛起阻塞方法的執(zhí)行。

1.定義一個(gè)協(xié)程

示例:

from time import sleep
import asyncio

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

# 返回一個(gè)特殊的協(xié)程對(duì)象,request函數(shù)內(nèi)部不會(huì)被執(zhí)行
c = request('www.baidu.com')

# 實(shí)例化一個(gè)事件循環(huán)對(duì)象
loop = asyncio.get_event_loop()

# 基于事件循環(huán)對(duì)象創(chuàng)建一個(gè)任務(wù)對(duì)象,并將協(xié)程對(duì)象封裝到該對(duì)象中
task = loop.create_task(c)

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

# 將協(xié)程對(duì)象注冊(cè)到事件循環(huán)對(duì)象中,并需要啟動(dòng)事件循環(huán)對(duì)象
# 當(dāng)事件循環(huán)對(duì)象內(nèi)的第一個(gè)參數(shù)遇到阻塞是,就會(huì)自動(dòng)執(zhí)行后面的對(duì)象,當(dāng)?shù)谝粋€(gè)對(duì)象的阻塞結(jié)束是會(huì)上報(bào)給事件循環(huán)對(duì)象,然后事件循環(huán)對(duì)象繼續(xù)執(zhí)行第一個(gè)對(duì)象,從而達(dá)到異步的效果
loop.run_until_complete(task)

2.給任務(wù)對(duì)象綁定回調(diào)

import asyncio

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

# 回調(diào)函數(shù)必須有一個(gè)參數(shù):task【任務(wù)對(duì)象】
# task.result():任務(wù)對(duì)象中封裝的協(xié)程對(duì)象對(duì)應(yīng)的特殊函數(shù)內(nèi)部的返回值
def callback(task):
  print('this is callback')
  print(task.result())

c = request('www.baidu.com')
# 創(chuàng)建一個(gè)任務(wù)對(duì)象
task = asyncio.ensure_future(c)
# 給任務(wù)對(duì)象綁定一個(gè)回調(diào)函數(shù)
task.add_done_callback(callback)
# 實(shí)例化一個(gè)事件循環(huán)對(duì)象
loop = asyncio.get_event_loop()
# 將協(xié)程對(duì)象注冊(cè)到事件循環(huán)對(duì)象中,并需要啟動(dòng)事件循環(huán)對(duì)象
loop.run_until_complete(task)

3.多任務(wù)異步協(xié)程

import asyncio
import time

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

loop = asyncio.get_event_loop()
# 任務(wù)列表:防止多個(gè)任務(wù)對(duì)象
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.多異步任務(wù)協(xié)程應(yīng)用

# aiohttp:支持異步的一個(gè)基于網(wǎng)絡(luò)請(qǐng)求的模塊
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:# 實(shí)例化請(qǐng)求對(duì)象
    async with await s.get(url) as response:
      page_text = await response.text()
      print(page_text)
      # 這里有返回值,是因?yàn)橐没卣{(diào)函數(shù)進(jìn)行數(shù)據(jù)解析
      return page_text

# 封裝回調(diào)函數(shù)用于數(shù)據(jù)解析
def parse(task):
  # 1.獲取相應(yīng)數(shù)據(jù)
  page_text = task.reault()
  print(page_text+',即將進(jìn)行數(shù)據(jù)解析...')
  # 以下解析操作


tasks = []
for url in urls:
  c = get_pageText(url)
  task = asyncio.ensure_future(c)
  # 給任務(wù)對(duì)象綁定回調(diào)函數(shù)用于數(shù)據(jù)解析
  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)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

错那县| 政和县| 怀化市| 兴义市| 九龙县| 武冈市| 锦屏县| 宁城县| 东阳市| 万安县| 柘荣县| 边坝县| 五大连池市| 阿图什市| 鞍山市| 郴州市| 湛江市| 聂拉木县| 潞城市| 新余市| 仲巴县| 金华市| 吉首市| 康乐县| 大竹县| 两当县| 鹤庆县| 石屏县| 唐山市| 布尔津县| 鲁甸县| 出国| 鲜城| 灌南县| 莆田市| 广元市| 临清市| 金寨县| 凤山县| 昆明市| 营口市|