python多工實現方法之協程

2021-10-02 11:50:18 字數 3177 閱讀 1653

多工的實現方式,使用下面方法中的乙個或者若干個進行組合:

1、多程序

2、多執行緒

3、協程

三種方式的實現和資源占用各有不同,其中資源占用和實現所需的系統開銷(記憶體、cpu等)逐漸減少,實現難度依次降低。

可以簡單的認為:乙個程序可以包含多個執行緒,乙個執行緒包含多個協程。

多工實現方式的選擇

cpu密集型任務:使用多程序

io密集型:使用多執行緒或協程

非同步:後面**無需等待(非阻塞)前面**執行完即可執行。

併發:簡單地理解為cpu數量小於程序數。

並行:簡單地理解為cpu數量大於或等於程序數。

協程的發展:python2時期的生成器(yield、yiled from)函式,到了python3進一步封裝為async、await關鍵字實現的方法。

包含yield關鍵字的函式即為生成器函式。

生成器的呼叫:使用for迴圈或者next(生成器);

與生成器的資料互動:使用生成器的send方法;

關閉生成器:close方法。

生成器執行過程

def mtd():

a = 1

x = 2

while true:

x = yield a

a += 1

if a > 10:

break

print(x)

y = mtd()

next(y)

y.send(2)

執行順序:

next --> 返回 a值1 --> send 2 --> x = 2 --> print 2
yield from 返回生成器物件(或者生成器函式的返回(return)值)

基本用法:

lis = [1, 2, 3]

def generator_2(lis):

yield from lis

z=generator_2(lis)

type(z) #

複雜用法:

# 子生成器

def generator_1():

total = 0

while true:

x = yield

print('加', x)

if not x: # if not none: true

break

total += x

return total

# 委託生成器

def generator_2():

while true:

# 建立呼叫方和子生成器的通道

total = yield from generator_1() # 子生成器

print('加和總數是:', total)

# 呼叫方

def main():

g2 = generator_2()

g2.send(none)

g2.send(2)

g2.send(3)

g2.send(none)

if __name__ == '__main__':

main()

第三方模組

由於是第三方模組,需要安裝

pip install greenlet

pip install gevent

gevent

import gevent

from gevent import monkey

monkey.patch_all() # 為下面的requests模組打補丁,進行重寫和封裝

import requests

def download(url):

print("get: %s" % url)

res = requests.get(url)

data = res.text

print(len(data), url)

# 多工

g1 = gevent.spawn(download, '') # 建立協程

g2 = gevent.spawn(download, '')

g3 = gevent.spawn(download, '')

g1.join()#等待協程結束

g2.join()

g3.join()

# 另一種實現方法

#gevent.joinall([

gevent.spawn(download, ''),

gevent.spawn(download, ''),

gevent.spawn(download, '')

])

greenlet

from greenlet import greenlet

import time

# 協程利用程式的io 來切換任務

def demo1():

while true:

print("demo1")

gr2.switch()

time.sleep(0.5)

def demo2():

while true:

print("demo2")

gr1.switch()

time.sleep(0.5)

gr1 = greenlet(demo1)

gr2 = greenlet(demo2)

gr1.switch() # 啟用協程

序列合併:

from itertools import chain

lis = [1, 2, 3]

dic =

print(list(chain(lis, dic, range(5, 10))))

Python 多工之協程(3)實現多工

學習理解迭代器和生成器之後,開始使用協程來實現多工 當乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通的函式,它的返回值是乙個生成器物件。我們可以使用next 或send 函式來啟動喚醒生成器物件,當程式第一次執行到yield時,程式暫停執行,並返回yield後邊跟的變數,當再次喚醒時,...

Python 多工 協程

高階程式設計技巧 學習筆記 1.1 同步 非同步 1.2 阻塞 非阻塞 2.1 什麼是協程?協程,又稱微執行緒。協程是 python 個中另外一種實現多工的方式,只不過比執行緒更小占用更小執行單元 理解為需要的資源 2.2 python中的協程大概經歷了如下三個階段 最初的生成器變形yield se...

多工實現方式 一

執行起來的應用程式就稱之為程序。也就是說當程式不執行的時候我們稱之為程式,當 程式執行起來他就是乙個程序。通俗的理解就是不執行的時候是程式,執行起來就是程序。程式和程序的對應關係是 程式只有乙個,但是程序可以有多個。程序是系統進行資源分配和排程的基本單位。在程式執行的過程中,由於被作業系統的排程演算...