非同步程式設計 協程

2022-03-10 20:52:51 字數 3806 閱讀 6818

現在是 python3.5 以後已經進入非同步時代

python由於gil(全域性鎖)的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板.

現有的python 非同步框架

python 中的主流django框架都在 往非同步靠攏 不得不說 要進入非同步的時代了 ,而我還不會非同步程式設計那就可悲了。

核心重點 非同步程式設計 來提高效能。

主要以 這以下三點來聊:

協程不是計算機提供的,計算機提供了程序和執行緒的概念,而協程是我們程式設計師人為。也叫微執行緒,使用者態上下文切換的一種技術。

通過乙個執行緒去**之間遊走切換之間去執行。

例如:普通的執行

def func1():

print(1)

print(2)

def func(2):

print(3)

print(4)

func1()

func2()

結果:

123

4

實現協程

pip3 install greenlet
from greenlet import greenlet

def func1():

print(1) # 第2步 輸出1

gr2.switch() # 第3步 切換到 func2 函式執行

print(2) # 第6步 輸出2

gr2.switch() # 第7步 切換到 func2 函式執行

def func2():

print(3) # 第4步 輸出3

gr1.switch() # 第5步 切換到 func1 函式執行

print(4) # 第8步 輸出4

gr1 = greenlet(func1)

gr2 = greenlet(func2)

gr1.switch() # 第1步:去執行func1 函式

結果:

132

4

def func1():

yield 1

yield from func2()

yield 2

def func2():

yield 3

yield 4

f1 = func1()

for item in f1:

print(item)

結果

132

4

yeild 這個實現的 了解即可

必須在python3.4及之後的版本才能用

import asyncio

@asyncio.coroutine

def func1():

print(1)

# 現在我用得失 sleep(2) 我要是換成 網路請求 意義就比重大了

yield from asyncio.sleep(2) # 遇到io耗時操作,自動化切換到tasks中的其他任務

print(2)

@asyncio.coroutine

def func2():

print(3)

yield from 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))

# 本來 應該等待 4 秒 執行時間其實也就是1秒 沒有等待4秒

注意⚠️:遇到io阻塞自動切換

結果

132

4

在python3.5 及以後的版本 才能用

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

那我們最常用的就是 async & await 關鍵字

在乙個執行緒中如果遇到io等待的時間,執行緒不會一直等待,利用空閒的時間去執行其他的任務 如果那個任務有結果了 在回去拿結果。

pip3 install requests
import requests

def download_image(url):

response = requests.get(url)

file_name = url.rsplit("/")[-1]

with open(file_name,'wb',) as f:

f.write(response.content)

if __name__ == '__main__':

url_list = [

'','',

'',]

for url in url_list:

download_image(url)

結果:

看結果 是安順序執行的 如果沒哥請求是兩分鐘的話 那就需要足足等待6分鐘。

如果我們用 非同步做就會大大的提高效能。

print(f'傳送請求')

asyncio.run(main())結果:

傳送請求

傳送請求

傳送請求

非同步程式設計 協程

現在是 python3.5 以後已經進入非同步時代 python由於gil 全域性鎖 的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板.現有的python 非同步框架 python 中的主...

協程和非同步程式設計1

協程 coroutine 也可以被稱為微執行緒,是一種使用者態內的上下文切換技術。簡而言之,其實就是通過乙個執行緒實現 塊相互切換執行。例如 def func1 print 1 print 2 def func2 print 3 print 4 func1 func2 上述 是普通的函式定義和執行,...

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...