0Pricing
Lua Academy · レッスン

シンプルなイベントループの構築

実行キューと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
end

yield による一時停止

コルーチンは待機が必要になると 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
end

I/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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. シンプルなイベントループの構築
  2. コルーチンによるAsync/Await
  3. Promise風パターン
  4. luasocketによるノンブロッキングI/O
← Lua Academyに戻る