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