協程昼捍,又稱微線程识虚,纖程。英文名Coroutine妒茬。協程是一種用戶態(tài)的輕量級線程担锤。
協程擁有自己的寄存器上下文和棧。協程調度切換時乍钻,將寄存器上下文和棧保存到其他地方肛循,在切回來的時候,恢復先前保存的寄存器上下文和棧银择。
因此多糠,協程能保留上一次調用時的狀態(tài)(即所有局部狀態(tài)的一個特定組合),每次過程重入時浩考,就相當于進入上一次調用的狀態(tài)夹孔,換種說法,進入上一次離開時所處邏輯流的位置析孽。
協程的好處:
- 無需現成上下文切換的開銷
- 無需原子操作鎖定及同步的開銷
- 方便切換控制流搭伤,簡化編程模型
- 高并發(fā)+高擴展性+低成本:一個CPU支持上萬個協程都不是問題。很適合用于高并發(fā)處理袜瞬。
缺點:
- 無法利用多核資源:協程的本質是個單線程怜俐,不能同時將單個CPU的多個核用上,協程需要和進程配合才能運行在多CPU上邓尤。
- 進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序
使用yield實現協程操作例子
# encoding: utf-8
"""
@author: Nero
@contact: csnero@qq.com
@time: 2020/7/21 21:54
@file: gevent下的纖程.py
@desc:
"""
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from greenlet import greenlet
def test1():
print(12)
gr2.switch()
print(34)
gr2.switch()
def test2():
print(56)
gr1.switch()
print(78)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
Gevent是一個第三方庫拍鲤,可以通過gevent實現并發(fā)同步或異步編程,在gevent中用到的主要模式是Greenlet,他以C擴展模塊形式接入python的輕量級協程裁赠。greenlet全部運行在主程序操作系統進程的內部殿漠,但是他們被協作式調度。
import gevent
def foo