コルーチンの概要

Luaはコルーチンをサポートしています。コルーチンをサポートしている言語は少ないので、その意味を知っている人は少ないかもしれません。

コルーチン(co-routine)とは関数の途中で処理を中断して制御を戻し、また中断途中から処理を再開できる仕組みのことです。

通常の関数は先頭から処理を始め、途中でリターンするか、関数の終わりまで処理を続けます。 そしてまた同じ関数が呼ばれても当然、先頭から処理を開始します。

それに対して、コルーチンは途中で制御を戻しても、次に実行されるときは前に中断した箇所から処理を開始することが出来るのです。

ちなみにコルーチンは協調的マルチスレッドとも呼ばれています。

コルーチンの例

それではコルーチンのサンプルコードを見ていきましょう。

--コルーチン
function func()
    print("コルーチン開始")
    -- 処理を中断(1回目)
    coroutine.yield "処理を中断1"
    print("ここから再開")
    -- 処理を中断(2回目)
    coroutine.yield "処理を中断2"
    print("次はここから再開")
    return "コルーチン終了"
end

-- コルーチンを作成
local co = coroutine.wrap(func)

-- 1回目呼出し
print(co())
print("----------------------")
-- 2回目呼出し
print(co())
print("----------------------")
-- 3回目呼出し
print(co())

coroutine.yield

コルーチンの仕組みである途中で中断をするには coroutine.yield関数を使用します。
coroutine.yieldの引数には呼出しもとに返す値を指定することが出来ます。

coroutine.wrap

コルーチンとして定義した関数は普通に呼び出すだけでは正常に動作しません。
コルーチンとして動作させるためにはcoroutine.wrap関数を使用します
coroutine.wrap関数の引数として関数を指定すると戻り値としてコルーチンとして使用できるオブジェクトが返ってきます。

コルーチンの呼出し

後は作成したコルーチンオブジェクトを通常の関数と同様の呼出し方をすればOKです。

サンプルを実行すれば大体の動きが掴めると思います。



inserted by FC2 system