協程(coroutine)是一種程序組件,一個輕量級的線程.在單核CPU中系統會將CPU劃分爲時間片,調度不一樣線程進行運行,給用戶形成全部程序在同時運行的錯覺;在多核CPU中每一個線程可能由不一樣的CPU來執行.可是協程單核CPU和多核CPU中都和單核CPU中線程同樣.協程在狀態機,角色模型,迭代器,產生器很是實用.在網上看了好多協程的介紹和例子,總結下.
協程實現的語言不是不少,lua是其中之一
1)lua中操做協程的函數:
coroutine.create() --建立一個協程
coroutine.yield() --掛起一個協程
coroutine.resume() --喚醒一個協程
lua中協程中經過yield和resume進行信息交換
resume中第一個參數是create函數的返回值即建立的協程句柄,後面參數是咱們須要傳遞給yield的值,因爲默認情況下協程是掛起的,所以第一次喚醒協程時,咱們傳入的第一個後面的參數均是做爲create函數中匿名函數的參數.
resume的返回值第一個參數表示協程的執行狀態,後面的值是有yield傳遞的.
yield傳遞的參數是resume時的返回值,yield的返回值是resume時的參數(除了第一次調用).
咱們經過一個程序能夠很容易理解協程工做原理.
輸出:
val : 1 2
main : true 3
x : 4
main : true 8
s : This is coroutine.
main : true
main : false
咱們如今用協程實現一個經典的生產者和消費者問題(由消費者驅動),
2)python中也支持協程,python中把它當作generator.python中提供了yield關鍵字,咱們一樣以生產者消費者模式來介紹.
示例:
python中若是一個函數含有yield關鍵字,就被視爲generator, generator默認具備next(), send(), close()方法, send和next均可以喚醒協程從上一個yield地方開始執行,但send能夠傳遞參數做爲yield返回值.
3)在wiki連接中提到了協程的經典實現中有個C語言實現的,看到這個實現原理讓我吃了一驚,原來C語言能夠在switch中嵌套循環.
同時boost1.53.0也加入了協程庫,並配置了處理網絡的例子(其實boost在1.53.0以前的asio庫中http例子中也實現了簡單的協程就是用到了前面C語言經典實現的原理書寫的).