Python 學習筆記 協程

2021-09-04 06:34:56 字數 1763 閱讀 4963

python裡面控制併發,除了多執行緒和多程序,還可以使用協程(coroutine)。他是在乙個執行緒內通過程式設計師人為的指定來進行切換

例1:通過switch()可以人為來回切換到另外乙個函式;當所有函式執行完畢,最後輸出print(10)

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author:alex li

from greenlet import greenlet

def test1():

print(12)

gr2.switch()

print(34)

gr2.switch()

print('9')

def test2():

print(56)

gr1.switch()

print(78)

gr1.switch()

gr1 = greenlet(test1)

gr2 = greenlet(test2)

gr1.switch()

print(10)

--------

1256

3478

910

例2,除了greenlet模組 我們還可以使用gevent模組

gevent是第三方庫,通過greenlet實現協程,其基本思想是:

當乙個greenlet遇到io操作時,比如訪問網路,就自動切換到其他的greenlet,等到io操作完成,再在適當的時候切換回來繼續執行。由於io操作非常耗時,經常使程式處於等待狀態,有了gevent為我們自動切換協程,就保證總有greenlet在執行,而不是等待io。

由於切換是在io操作時自動完成,所以gevent需要修改python自帶的一些標準庫,這一過程在啟動時通過monkey patch完成:

例如:首先匯入gevent和猴子補丁,然後定義乙個函式f,gevent.spawn的主要功能是生產greenlet的物件,然後他會內部自動切換,當執行了第乙個列印命令之後,因為會阻塞,所以會自動切換到其他的greenlet物件執行操作,之後再切換回來獲取資料結果。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from gevent import monkey; monkey.patch_all()

import gevent

import requests

def f(url):

print('get: %s' % url)

resp = requests.get(url)

data = resp.text

print('%d bytes received from %s.' % (len(data), url))

gevent.joinall([

gevent.spawn(f, ''),

gevent.spawn(f, ''),

gevent.spawn(f, ''),

])----------

"c:\program files\python3\python.exe" c:/temp/s13day11/day11/s18.py

get: 

get: 

get: 

47413 bytes received from .

24810 bytes received from .

450576 bytes received from .

Python學習筆記 協程

二十 協程 協程,又稱微執行緒,纖程,coroutine 子程式 又稱為函式 在所有語言中都是層級呼叫 a呼叫b b呼叫c c返回b b 返回 a 所以子程式呼叫是通過棧實現的 乙個執行緒就是執行乙個子程式 子程式呼叫總是乙個入口 一次返回 呼叫順序是明確的 而協程的呼叫和子程式不同 協程看上去也是...

python學習筆記 協程

協程 協程是一種允許在特定位置暫停或恢復的子程式 這一點和生成器相似。但和生成器不同的是,寫成可以控制子程式暫停之後 的走向,而生成器僅能被動的將控制權交還給呼叫者。練習1 假設有兩個子程式main和printer。printer是乙個死迴圈,等待輸入 加工並輸出結果。main作為主程式,不時地向p...

Python學習筆記 協程

協程 為非搶占式多工產生子程式的計算機元件,協程允許不同入口點在不同位置暫停或開始執行程式 從技術角度上講,是乙個可以暫停執行的函式,生成器 實現 1.yield返回 2.send呼叫 協程的四個狀態 inspect.getgeneratorstate 函式確定,該函式會返回下述字串的乙個 gen ...