協程
又叫微執行緒,coroutine,可以認為是比執行緒更小的執行單元,自帶cpu上下文,。
通俗理解:在乙個執行緒的某個函式,可以再任何地方儲存當前函式的一些臨時變數等資訊,然後切換到另乙個函式執行,並且切換的次數和什麼時候再切換到原來的函式由開發者自己確定。
協程和執行緒差異
執行緒非常耗效能,從系統層面遠不止儲存和恢復cpu上下文,os的每個執行緒都有自己快取cache等資料等。協程的切換只是單純操作cpu上下文
執行結果
---b---
---a---
---b---
---a---
---b---
---a---
---b---
---a---
但是用生成器來做協程感覺不是很優美,greenlet
sudo pip install greenlet#python3匯入pip3
#coding=utf-8
from greenlet import greenlet
import time
def test1():
while true:
print("---a---")
gr2.switch()
time.sleep(0.5)
def test2():
while true:
print("---b---")
gr1.switch()
time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
#切換到gr1中執行
gr1.switch()
greenlet的底層**由c語言寫的,執行結果一樣
gevent比greenlet更強大,自動切換任務,原理是當乙個greenlet遇到耗時操作如訪問網路時,會自動切換到其他greenlet,操作完成再切換回來繼續執行。
#coding=utf-8
import gevent
def f(n):
for i in range(n):
print gevent.getcurrent(), i
g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()
執行結果:3個greenlet依次執行而不是交替執行
012
3401
2340
1234
gevent切換執行
#coding=utf-8
import gevent
def f(n):
for i in range(n):
print gevent.getcurrent(), i
#⽤來模擬⼀個耗時操作, 注意不是time模組中的sleep
gevent.sleep(1)
g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()
執行結果 3個greenlet交替執行
000
1112
2233
3444
gevent版伺服器 monkey打補丁,動態修改下邊的**
第14天 網路配置
etc sysconfig network scripts ifcfg ens33 device ens33 網絡卡名 name ens33 bootproto static 靜態dhcp 為自動獲取 type ethernet 網路型別 ipaddr 192.168.41.105 ip ipadd...
第12天 網路協議和管理
1.apr是乙個通過解析網路層位址來找尋資料鏈路層位址的網路傳輸協議。2.網絡卡 物理層 具有唯一mac位址寫在rom上。3.保留私有位址 172.16.0.0 172.31.255.255 192.168.0.0 192.168.255.255 4.絡攻擊式ddos全稱是 distributed ...
python學習第16天
1.time 獲取本地時間戳 2.localtime 獲取本地時間元組 引數是時間戳,預設為當前 3.mktime 通過時間元組獲取時間戳 引數是時間元組 4.ctime 獲取本地時間字串 引數是時間戳,預設當前 5.asctime 通過時間元組獲取時間字串 引數是時間元組 了解 弊端 不能自動識別...