並列性に関しては、ほとんどのプログラマーはすぐに思い出します マルチスレッド または 非同期しかし、Luaには独自のツールがあります。 コルティン。これにより、複数のスレッドを持っているかのようにコードを記述できますが、実行は単一のスレッド内に留まります。
コルーチンとは 軽い「流れ」、手動で一時停止および再開できます。
最初から最後まで実行される通常の関数とは異なり、コルーチンは次のことができます。
実行中に停止する、
呼び出し元のコードに制御を戻します。
そして、同じ場所から作業を続けます。
これはゲーム🎮の一時停止のようなものです。状態を保存し、同じ瞬間から静かに続行しました。

Luaでのコルーチンの例
function worker()
for i = 1, 3 do
print("Step " .. i)
coroutine.yield() -- приостанавливаемся
end
end
co = coroutine.create(worker)
coroutine.resume(co) --> Шаг 1
coroutine.resume(co) --> Шаг 2
coroutine.resume(co) --> Шаг 3
分析:
coroutine.create— コルーチンを作成します。coroutine.resume— それを開始または続行します。coroutine.yield—実行を一時停止します。
coroutineはスレッドとどう違うのですか?
スレッド | コルーチン |
|---|---|
OS 管理 | Lua自体によって管理されます |
並行して実行可能 | 1つずつ実行されます |
デバッグが難しい | シンプルで予測可能 |
データ保護が必要です(mutex、lock) | 実際の並列処理がないため安全 |
コルーチンはどこで役立ちますか?
ゲームとアニメーション — 入れ子になったifとタイマーなしのステップバイステップのシナリオ。
非同期タスク — ネットワーク要求、イベント処理。
スクリプトシナリオ — NPC またはボットの動作の簡単な説明。
ゲームの小さな例
function npc()
print("NPC: I'm coming...")
coroutine.yield()
print("NPC: I stopped...")
coroutine.yield()
print("NPC: I'm coming again!")
end
co = coroutine.create(npc)
coroutine.resume(co) -- NPC: Я иду...
coroutine.resume(co) -- NPC: Я остановился...
coroutine.resume(co) -- NPC: Я снова иду!
複雑なロジックの代わりに、オブジェクトのミニシアターを書くようなシンプルなシナリオを使用します。
合計
Luaのコルーチンとは マルチスレッドではなく、並列実行を簡単にシミュレートする方法。ゲーム、ネットワークアプリケーション、およびアクションの順序を制御することが重要なシナリオに最適です。
Luaを学ぶ場合は、必ずコルーチンを試してみてください。これにより、アーキテクチャが大幅に簡素化されます。 コディケ Luaのタスクを伴う興味深いコース。
また、アクティブな テレグラムチャンネル、ここでは素晴らしいアイデアについて話し合い、経験を共有し、課題を一緒に分析します。学習は有益であるだけでなく、楽しいものになります。
