一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua協同程序coroutine的簡介及優缺點

Lua協同程序coroutine的簡介及優缺點

2020-05-09 10:59Czhenya Lua

今天小編就為大家分享一篇關于Lua協同程序coroutine的簡介及優缺點,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

什么是協同(coroutine)?

Lua 協同程序(coroutine)與線程比較類似:擁有獨立的堆棧,獨立的局部變量,獨立的指令指針,同時又與其它協同程序共享全局變量和其它大部分東西。

協同是非常強大的功能,但是用起來也很復雜。

線程和協同程序區別

協程是編譯器級別的,線程是操作系統級別的,在多處理器情況下,多線程程序同時運行多個線程;而協同程序是通過協作來完成,在任一指定時刻只有一個協同程序在運行,并且這個正在運行的協同程序只在必要時才會被掛起。這樣Lua的協程就不能利用現在多核技術了。

coroutine優缺點分析

上面對coroutine有個基本的了解,因此大家都會象我一樣去想,為什么要用coroutine?先研究下優點

  • 每個coroutine有自己私有的stack及局部變量。
  • 同一時間只有一個coroutine在執行,無需對全局變量加鎖。
  • 順序可控,完全由程序控制執行的順序。而通常的多線程一旦啟動,它的運行時序是沒法預測的,因此通常會給測試所有的情況帶來困難。所以能用coroutine解決的場合應當優先使用coroutine。

再看缺點,研究coroutine缺點之前,我尋找了一下Lua中為什么實現coroutine的一些說明。在巴西人寫的paper Coroutines in Lua(pdf)中解釋了幾個原因:

  • Lua是ANSI C實現的,ANSI C并不包含thread的實現,因此如果要在Lua增加thread的支持就要使用操作系統本地的實現,這樣會造成通用的問題。同時也會使Lua變得臃腫。因此Lua選擇了在ANSI C上實現的coroutine。
  • Lua主要設計目的之一是給C調用,如果Lua內部又有多線程實現的話會造成C調用狀態的混亂,而只提供coroutine層面的掛起則可以保持狀態的一致性。

以上這些理由都是基于Lua特殊的原因而使用的,并不是很通用的原因。我們也了解到,coroutine實際上是一種古老的設計模式,它在60年代就已經定型,但是現代語言很少有重視這個特性,目前可以舉例的有Windows的fibers, Python的generators

基本語法:

Lua協同程序coroutine的簡介及優缺點

簡例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--定義協同函數 (匿名函數)
cor = coroutine.create(
  function(a,b)
    print(a+b)
    coroutine.yield()  --掛起
    print(a-b)
  end
)
--調用協同函數,,(暫停、繼續)
res=coroutine.resume(cor,10,20)
--接收的參數第一個是是否成功執行,后面的才是協程運行的返回值
print(res)
print("Czhenya的協程")
--繼續運行協程,不需要傳遞參數,即使傳遞也只使用第一次傳的參數
coroutine.resume(cor)
--協程的狀態 suspended(掛起,暫停) running(運行) date(死亡,結束)
print(coroutine.status(cor))
--協程運行完成后不能再次啟動
coroutine.resume(cor)
--[[ 輸出是 :
30
true
Czhenya的協程
-10
dead
--]]

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/Czhenya/article/details/78460665

延伸 · 閱讀

精彩推薦
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
主站蜘蛛池模板: 闺蜜调教我做她的脚奴 | 91桃色视频在线观看 | 欧美激情 亚洲 | 俺去啦最新地址 | h版在线观看 | 午夜伦理 第1页 | 操穴片| 男人天堂网站在线 | 岛国在线播放v片免费 | 亚洲欧美久久久久久久久久爽网站 | 九九精品视频在线观看 | 99久热只有精品视频免费看 | 我在厨房摸岳的乳HD在线观看 | 黄情视频 | 东北老妇露脸xxxxx | 国产一级免费片 | 国产精品一区二区在线观看完整版 | 国产一区二 | www.羞羞答答 | bt岛www| 韩国久播影院理论片不卡影院 | 免费视频精品一区二区 | 成人私人影院在线观看网址 | eeuss免费快捷 | 歪歪私人影院成人毛片 | 日韩精选在线 | 高清男的插曲女的 欢迎你老狼 | 久久亚洲精品AV成人无 | 九九热只有精品 | 黄色a∨ | 蘑菇香蕉茄子绿巨人丝瓜草莓 | 国产成人精品午夜视频' | 国产午夜精品福利久久 | 欧美成人免费一区在线播放 | 免费观看在线永久免费xx视频 | 国产精品久久久久毛片真精品 | 成人一区二区免费中文字幕 | 草大逼| 九九九好热在线 | 亚洲黄色成人 | 精品午夜中文字幕熟女人妻在线 |