ooc lang 協程的使用及一些要點

2021-09-11 01:58:43 字數 2285 閱讀 5823

這節記錄一下ooc-lang中協程的使用。

通俗地講,協程就是執行乙個函式,當然它是以一種比較特殊的方式執行的。我們把相關的功能封裝到乙個函式中,這個函式可能存在一些狀態(按我的理解,狀態就是記錄一些屬性的變數,比如函式開始執行時,它的初始狀態下的區域性變數為某乙個值,執行一段時間後,它的狀態變了,此時的變數的值可能為另乙個值了),然後把這個函式交給協程執行。協程執行函式時的特殊地方在於:如果條件未滿足,隨時可以跳出這個函式,從而去執行另外的**,然後在某個地方,條件滿足後,又回到該協程中執行這個函式,此時該函式的狀態仍保留著上一次執行後的,因此可以繼續上一次的狀態執行,而不是從初始狀態執行。我們知道,每次呼叫乙個函式,它裡邊的區域性變數都是一種初始狀態,當然函式裡邊呼叫的全域性變數除外。

ooc-lang的原始碼本身是翻譯成c語言的,所以ooc-lang的協程的底層也是用c語言實現的。當然,這裡不看底層原始碼和實現邏輯。ooc-lang的協程原始碼在這裡coro.ooc,不多,不到百行。不多平台或不同語言的協程使用起來可能不一樣,即使是同一語言的不同實現的協程,用法也可能不一樣。像雲風前輩用c實現的協程庫,他的協程函式可以傳入引數,以及可以獲取協程的執行狀態。我簡單看了下u3d中,當然,它的又不一樣。

下面我講下ooc-lang的協程的特點:

ooc-lang的協程不接收任何引數,因此我們無法給協程的函式傳參,這就有點不方便了,如果不同協程間要互動的話,比如在乙個協程中啟動另乙個協程,此時我需要將某個變數的值傳給它,就傳不了,只能將變數宣告為相對於協程之間為全域性的了。

ooc-lang的協程的啟動必須由另乙個協程呼叫startcoro()來啟動,可以定義乙個主協程,一般子協程都用主協程啟動。主協程和子協程的區別就是:主協程不可以yield()而子協程可以。

所有子協程都可以在函式內部通過呼叫yield()來主動交出執行許可權,所有協程都可以通過呼叫switchto()來切換並執行另乙個協程。

ooc-lang的協程無法手動停止,得等它執行到設定的條件為止。不像u3d中的可以手動stop掉。

介紹完特點,再演示乙個我寫的簡單例子看下吧。例子的模型是模擬乙個場景,場景的主迴圈每隔一定時間就執行一遍,場景的事件是模擬乙個餐廳中顧客點菜,服務員上菜。當然,這個場景並沒有真正的畫面,也與現實中的場景並不完全相符,只是給個簡單的例子體會體會。

/*

* corodemo.ooc

*/// 相關模組的引入

import os/[coro, time]

import structs/arraylist

import math/random

// 餐廳類

restaurant: class " println()

} // 服務員上菜

waiter: func " println() }}

main: func

// 注意這裡,這句是切換回主協程的意思,如果沒有這句,當子協程執行完後會直接退出整個程式

customercoro switchto(maincoro)

)// 通過主協程啟動乙個服務員協程,引數與和上面介紹的一致

// 原理也和顧客協程查不多,就不多說了

maincoro startcoro(waitercoro, ||

if (!startorder) waitercoro yield()

numcustomer := restaurant numcustomer

while (numcustomer > 0)

"點菜完畢" println()

endorder = true

waitercoro switchto(maincoro)

)startorder = true

} // 如果顧客沒有點完菜,每跑一次主迴圈都切回子協程執行,直到子協程執行完畢

// 為了不影響遊戲邏輯,一般協程的執行都是等遊戲邏輯執行完再執行的吧?畢竟協程實在同乙個執行緒中執行的。不過這個我也還不太清楚

if (!endorder)

// 主迴圈會執行8次

if (runtime > 8) else

// 每次執行都間隔1秒鐘

time sleepmilli(1000)

}}

這是執行截圖:

可以看到顧客點了5個菜,服務員也上了5個菜。點完菜後,主迴圈繼續執行了幾遍。

協程的基本原理和使用就差不多是這樣了。全文完 ?

關於協程中yield return的一些使用

1.協程與執行緒 unity中的特殊在於所有的指令碼和 都是在乙個主線程裡執行的,協程也不例外。協程與執行緒的相似點只在於,協程看起來也可以與其他函式並行執行。但本質上來說,執行緒 是通過可以開啟多個子執行緒同時執行程式,而達到並行。而協程則是通過每幀檢測的方式,在自己與其他函式之間切換。2.yie...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

優雅的使用 Python 協程

協程 coroutine 是由程式設計師在 中顯示排程的。程序和執行緒是由作業系統排程,執行緒是作業系統排程的最小單位 看過前邊的文章應該知道,執行緒任務在 io 阻塞之後,作業系統會進行執行緒切換,這個切換會浪費時間與資源。而協程是在單個執行緒中併發的多個任務,當執行中的協程任務遇到阻塞之後,立即...