シンプルなイベントループの構築
実行キューとresumeループを備えたコルーチンスケジューラーを実装します。
「シンプルなイベントループの構築」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
イベントループとは
イベントループは、待機しているイベントの準備が整ったときにコルーチンを再開するスケジューラを実行します。これにより、OS スレッドを使わずに複数のタスクを同時に実行できます。
実行キュー
準備済みのコルーチンを格納するキューから始めます。各ティックで、準備済みのコルーチンを一つずつすべて処理します。
local queue = {}
local function spawn(fn)
queue[#queue+1] = coroutine.create(fn)
endループのティック
各ティックで、準備済みのコルーチンをキューから取り出して再開します。yield したコルーチンは、キューに再追加されるまで一時停止します。
local function runLoop()
while #queue > 0 do
local current = queue
queue = {}
for _, co in ipairs(current) do
local ok, err = coroutine.resume(co)
if not ok then print("Error:", err) end
if coroutine.status(co) ~= "dead" then
queue[#queue+1] = co -- re-queue if still alive
end
end
end
endyield による一時停止
コルーチンは待機が必要になると yield します。スケジューラは次のティックでコルーチンを再開します。
spawn(function()
print("Task A: step 1")
coroutine.yield() -- pause
print("Task A: step 2")
end)
spawn(function()
print("Task B: only step")
end)
runLoop()遅延のシミュレーション
コルーチンをいつ再開するかを追跡して、sleep を実装します。
local timers = {}
local function sleep(seconds)
local wakeAt = os.clock() + seconds
timers[coroutine.running()] = wakeAt
coroutine.yield()
endタイマー対応のループ
各ティックでタイマーを確認し、起床時刻を過ぎたコルーチンをキューに戻します。
local function timedLoop()
while #queue > 0 or next(timers) do
local now = os.clock()
for co, wakeAt in pairs(timers) do
if now >= wakeAt then
timers[co] = nil
queue[#queue+1] = co
end
end
-- process queue...
end
endI/O の統合
select/poll 機構と統合します。I/O を待つコルーチンを yield させ、ファイルディスクリプタの準備が整ったときに再開します。
エラーの分離
各コルーチンの再開を pcall でラップするか、ok の戻り値を確認します。クラッシュしたコルーチンによってループ全体が停止しないようにします。
協調スケジューリング
タスクは自発的に yield する必要があります。yield せずに無限に実行するコルーチンがあると、他のすべてのタスクが実行できなくなります。信頼できないコードに対するプリエンプション防止策として、ステップカウンタと debug.sethook を使用します。
タスクの優先度
複数のキュー(高・通常・低優先度)を実装し、各ティックで優先度の高いキューから先に処理します。
実運用での代替手段
本番環境で使われるイベントループには、luv(libuv バインディング)、copas(ソケットベース)、OpenResty(nginx + cosockets)があります。独自実装は、学習目的または組み込み用途に限ることをお勧めします。
イベントループに関する質問
協調的なイベントループ内のコルーチンは、なぜ自発的に yield する必要がありますか?
まとめ: シンプルなイベントループ
イベントループは、コルーチンの実行キューを使用します。各ティックで準備済みのコルーチンを再開します。タスクは一時停止するために yield し、条件が満たされるとキューに戻されます。これにより、シングルスレッドの Lua で I/O とタイマーを同時に扱えます。
よくある質問
「シンプルなイベントループの構築」レッスンは無料ですか?
はい。「シンプルなイベントループの構築」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「シンプルなイベントループの構築」で何を学びますか?
実行キューとresumeループを備えたコルーチンスケジューラーを実装します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「シンプルなイベントループの構築」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シンプルなイベントループの構築
- コルーチンによるAsync/Await
- Promise風パターン
- luasocketによるノンブロッキングI/O