中gather函式 深入理解Python中的協程

2021-10-14 17:06:54 字數 2476 閱讀 9664

協程:是單執行緒下的併發,又稱微執行緒。英文名是coroutine。它和執行緒一樣可以排程,但是不同的是執行緒的啟動和排程需要通過作業系統來處理。協程是一種比執行緒更加輕量級的存在,最重要的是,協程不被作業系統核心管理,協程是完全由程式控制的。執行效率極高,協程的切換完全由程式控制,不像執行緒切換需要花費作業系統的開銷,執行緒數量越多,協程的優勢就越明顯。協程不需要多執行緒的鎖機制,因為只有乙個執行緒,不存在變數衝突。對於多核cpu,利用多程序+協程的方式,能充分利用cpu,獲得極高的效能。注意協程這個概念完全是程式設計師自己想出來的東西,它對於作業系統來說根本不存在。作業系統只有程序和執行緒。yield關鍵字相當於是暫停功能,程式執行到yield停止,send函式可以傳參給生成器函式,引數賦值給yield

def customer():while true:

number = yieldprint('開始消費:',number)

custom = customer()

next(custom)for i in range(5):print('開始生產:',i)

custom.send(i)

結果如下
開始生產: 0

開始消費: 0

開始生產:1

開始消費:1

開始生產:2

開始消費:2

開始生產:3

開始消費:3

開始生產:4

開始消費:4

**解析:

協程使用生成器函式定義:定義體中有 yield 關鍵字。

yield 在表示式中使用;如果協程只需從客戶custom接收資料,如果沒有產出的值,那麼產出的值是 none。

首先要呼叫 next(…) 函式,因為生成器還沒啟動,沒在 yield 語句處暫停,所以一開始無法傳送資料。

呼叫send方法,把值傳給 yield 的變數,然後協程恢復,繼續執行下面的**,直到執行到下乙個 yield 表示式,或者終止。

如果乙個物件可以在await語句中使用,那麼它就是可等待物件。協程中的還乙個重要概念,任務(task)。如果寫乙個數字是乙個任務,那麼毛利我要完成5個任務。毛利我寫個1-5都這麼慢,不行,我要加速寫。asyncio.create_task()函式用來併發執行作為asyncio任務 的多個協程。

import asyncio

async def print_num(num):print("maoli is printing " + str(num) + " nows" )

await asyncio.sleep(1)print("maoli prints" + str(num) + " ok")

async def main(nums):

tasks = [asyncio.create_task(print_num(num)) for num in nums]for task in tasks:

await task

%time asyncio.run(main([i for i in range(1,6)]))

maoli is printing 1 nows

maoli is printing 2 nows

maoli is printing 3 nows

maoli is printing 4 nows

maoli is printing 5 nows

maoli prints1 ok

maoli prints3 ok

maoli prints5 ok

maoli prints2 ok

maoli prints4 ok

wall time: 1.01 s

還可以寫成await asyncio.gather(*tasks)這種方法
import asyncio

async def print_num(num):print("maoli is printing " + str(num) + " nows" )

await asyncio.sleep(1)print("maoli prints" + str(num) + " ok")

async def main(nums):

tasks = [asyncio.create_task(print_num(num)) for num in nums]

await asyncio.gather(*tasks)

%time asyncio.run(main([i for i in range(1,6)]))

*tasks解包列表,將列表變成了函式的引數;與之對應的是,

深入理解函式

第五章 深入理解函式 1.return語句 有返回值的函式中,return語句的作用式提供整個函式的返回值,並結束當前函式返回到呼叫它的地方。在沒有返回值的函式中也可以使用return語句,例如當前檢查到乙個錯誤時提前結束當前函式的執行並返回 這個函式首先檢查引數x是否大於0,如果x不大於0就列印錯...

深入理解指標函式

1.指標函式的定義 顧名思義,指標函式即返回指標的函式。其一般定義形式如下 型別名 函式名 函式引數表列 其中,字尾運算子括號 表示這是乙個函式,其字首運算子星號 表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個 指向返回值為 的指標 位址 型別名 表...

深入理解指標函式

顧名思義,指標函式 即返回指標的函式。其一般定義形式如下 型別名 函式名 函式引數表列 其中,字尾運算子括號 表示這是乙個函式,其字首運算子星號 表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個 指向返回值為 的指標 位址 型別名 表示函式返回的指標指...