五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動態(tài)

Python協(xié)程方式的實現(xiàn)及意義筆記分享

發(fā)布日期:2022-01-05 09:23 | 文章來源:gibhub

協(xié)程

協(xié)程不是計算機提供的,是程序員認為創(chuàng)造
協(xié)程也被稱為微線程,是一種用戶態(tài)的上下文切換技術,簡而言之,就是通過一個線程實現(xiàn)代碼互相切換執(zhí)行
實現(xiàn)協(xié)程的幾種方法:

  • 1)greenlet,早期模塊
  • 2)yield關鍵字
  • 3)asyncio裝飾器 (python3.4以后引入的)
  • 4)async,await關鍵字 (python3.5) 推薦

1.greenlet實現(xiàn)協(xié)程

greentlet是一個第三方模塊,需要提前安裝 pip3 install greenlet才能使用。

from greenlet import greenlet
def func1():
 print(1)  # 第1步:輸出 1
 gr2.switch() # 第3步:切換到 func2 函數(shù)
 print(2)  # 第6步:輸出 2
 gr2.switch() # 第7步:切換到 func2 函數(shù),從上一次執(zhí)行的位置繼續(xù)向后執(zhí)行
def func2():
 print(3)  # 第4步:輸出 3
 gr1.switch() # 第5步:切換到 func1 函數(shù),從上一次執(zhí)行的位置繼續(xù)向后執(zhí)行
 print(4)  # 第8步:輸出 4
gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch() # 第1步:去執(zhí)行 func1 函數(shù)

輸出的結果:
1
3
2
4

注意:switch中也可以傳遞參數(shù)用于在切換執(zhí)行時相互傳遞值。

2.yield

基于Python的生成器的yield和yield form關鍵字實現(xiàn)協(xié)程代碼。

def func1():
 yield 1#第一步執(zhí)行這里會生成1
 yield from func2() #這里會跳到func2,然后執(zhí)行里面的代碼,執(zhí)行完func2函數(shù)后會繼續(xù)以跳轉之前的狀態(tài)繼續(xù)執(zhí)行以下代碼
 yield 2
def func2():
 yield 3
 yield 4 
# 這里是一個生成器對象
f1 = func1()
# 遍歷執(zhí)行生成器
for item in f1:
 print(item)

執(zhí)行結果
1
3
4
2

注:用這種方法比較牽強,真正開發(fā)環(huán)境中基本不會用這種方法實現(xiàn)協(xié)程(yield form關鍵字是在Python3.3中引入的。)

3.asyncio

在Python3.4之前官方未提供協(xié)程的類庫,一般大家都是使用greenlet等其他來實現(xiàn)。在Python3.4發(fā)布后官方正式支持協(xié)程,即:asyncio模塊。

import asyncio
#這就是一個用協(xié)程實現(xiàn)的函數(shù)
@asyncio.coroutine
def func1():
 print(1)
 yield from asyncio.sleep(2)  # 遇到IO耗時操作,自動化切換到tasks中的其他任務
 print(2)
loop = asyncio.get_event_loop()
#執(zhí)行
loop.run_until_complete(func1())

同時執(zhí)行多個協(xié)程

import asyncio
@asyncio.coroutine
def func1():
 print(1)
 yield from asyncio.sleep(2)  # 遇到IO耗時操作,自動化切換到tasks中的其他任務
 print(2)
@asyncio.coroutine
def func2():
 print(3)
 yield from asyncio.sleep(2) # 遇到IO耗時操作,自動化切換到tasks中的其他任務
 print(4)
tasks = [
 asyncio.ensure_future( func1() ),
 asyncio.ensure_future( func2() )
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

結果
1
3
2
4

注意:基于asyncio模塊實現(xiàn)的協(xié)程比之前的要更厲害,因為他的內部還集成了遇到IO耗時操作自動切花的功能。

4.async & awit

async & awit 關鍵字在Python3.5版本中正式引入,基于他編寫的協(xié)程代碼其實就是 上一示例 的加強版,讓代碼可以更加簡便。

Python3.8之后 @asyncio.coroutine 裝飾器就會被移除,推薦使用async & awit 關鍵字實現(xiàn)協(xié)程代碼。

import asyncio
async def func1():
 print(1)
 await asyncio.sleep(2)
 print(2)
async def func2():
 print(3)
 await asyncio.sleep(2)
 print(4)
tasks = [
 asyncio.ensure_future(func1()),
 asyncio.ensure_future(func2())
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

常用的是:greenlet,async&awit

協(xié)程的意義

在一個線程中遇到IO耗時,線程不會等待,利用空余的時間去執(zhí)行其他的方法

爬蟲案例

例如:用代碼實現(xiàn)下載 url_list 中的圖片。

方式一:同步編程實現(xiàn)

import requests
def download_image(url):
 print("開始下載:",url)
 # 發(fā)送網(wǎng)絡請求,下載圖片
 response = requests.get(url)
 print("下載完成")
 # 圖片保存到本地文件
 file_name = url.rsplit('_')[-1]
 with open(file_name, mode='wb') as file_object:
  file_object.write(response.content)
if __name__ == '__main__':
 url_list = [
  'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
  'https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg',
  'https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg'
 ]
 for item in url_list:
  download_image(item)

結果
開始下載: https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg
下載完成
開始下載: https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg
下載完成
開始下載: https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg
下載完成

方式二:基于協(xié)程的異步編程實現(xiàn)

import aiohttp
import asyncio
async def fetch(session, url):
 print("發(fā)送請求:", url)
 async with session.get(url, verify_ssl=False) as response:
  content = await response.content.read()
  file_name = url.rsplit('_')[-1]
  with open(file_name, mode='wb') as file_object:
file_object.write(content)
async def main():
 async with aiohttp.ClientSession() as session:
  url_list = [
'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
'https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg',
'https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg'
  ]
  tasks = [asyncio.create_task(fetch(session, url)) for url in url_list]
  await asyncio.wait(tasks)
if __name__ == '__main__':
 asyncio.run(main())

結果
發(fā)送請求: https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg
發(fā)送請求: https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg
發(fā)送請求: https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg
下載完成 https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg
下載完成 https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg
下載完成 https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg

上述兩種的執(zhí)行對比之后會發(fā)現(xiàn),基于協(xié)程的異步編程 要比 同步編程的效率高了很多。因為:

  • 同步編程,按照順序逐一排隊執(zhí)行,如果圖片下載時間為2分鐘,那么全部執(zhí)行完則需要6分鐘。
  • 異步編程,幾乎同時發(fā)出了3個下載任務的請求(遇到IO請求自動切換去發(fā)送其他任務請求),如果圖片下載時間為2分鐘,那么全部執(zhí)行完畢也大概需要2分鐘左右就可以了。

小結

協(xié)程一般應用在有IO操作的程序中,因為協(xié)程可以利用IO等待的時間去執(zhí)行一些其他的代碼,從而提升代碼執(zhí)行效率。

以上就是Python協(xié)程的方式實現(xiàn)及意義筆記分享的詳細內容,更多關于Python協(xié)程的方式實現(xiàn)及意義的資料請關注本站其它相關文章!

版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部