1. ホーム
  2. スクリプト・コラム
  3. ルア

Lua連携プログラムcoroutineの紹介とメリット・デメリット

2022-01-09 21:55:27

コルーチンとは何ですか?

Luaのコルーチンはスレッドに似ており、スタック、ローカル変数、命令ポインタが独立しており、グローバル変数やその他のほとんどのものを他のコルーチンと共有します。

コラボレーションは非常に強力ですが、使い方が非常に複雑です。

スレッドと協働プログラムの違い

並行プログラムはコンパイラレベル、スレッドはOSレベルで、マルチプロセッサの場合、マルチスレッドプログラムは複数のスレッドを同時に実行します。一方、協調プログラムはコラボレーションによって行われ、ある瞬間に1つの協調プログラムだけが実行され、その実行中の協調プログラムは必要なときだけハングします。このように、Luaの協調プログラムは、現在のマルチコア技術を活用することができません。

コルーチンのメリット・デメリットの分析

上記はコルーチンの基本的な理解なので、私と同じように「なぜコルーチンなのか? /長所を検証してみましょう。

  • 各コルーチンは、独自のプライベートスタックとローカル変数を持つ。 /各コルーチンは、独自のプライベートスタックとローカル変数を持ちます。
  • 同時に実行されるのは1つのコルーチンだけなので、グローバル変数をロックする必要はない。
  • 実行順序はプログラムによって完全に制御される。これに対して、マルチスレッドは通常一旦起動すると、そのタイミングが予測できないため、通常、すべてのケースをテストすることは困難である。そのため、コルーチンは解決可能な場合に優先的に使用されるべきである。

改めて欠点を見てみると、コルーチンの欠点を調べる前に、なぜLuaでコルーチンが実装されているのかの説明がないかを探しました。ブラジルの論文Coroutines in Lua (pdf)では、いくつかの理由が説明されています。

  • LuaはANSI Cの実装であり、ANSI Cにはスレッドの実装がないため、Luaにスレッドサポートを追加するとOSネイティブの実装を使う必要があり、汎用性に問題がある。また、Luaが扱いにくくなる。そこでLuaは、ANSI C上でコルーチンを実装することを選択した。
  • Luaの主な設計目標の1つはC言語の呼び出しを与えることであり、Lua内部にマルチスレッドの実装があるとC言語の呼び出しの状態に混乱が生じますが、コルーチンレベルのハングのみを提供すれば状態の一貫性を保つことができます。

これらはすべてLua固有の理由で使用され、あまり一般的な理由ではありません。また、コルーチンは実は60年代に確定した古いデザインパターンですが、現代の言語でこの機能に注目しているものは少なく、例えばWindowsファイバー、Pythonジェネレータなどであることがわかりました

基本的な構文です。

短い例です。

-- Define a synergy function (anonymous function)
cor = coroutine.create(
  function(a,b)
    print(a+b)
    coroutine.yield() -- hang 
    print(a-b)
  end
)
-- call the co function,, (pause, resume)
res=coroutine.resume(cor,10,20)
-- the first argument received is whether the execution was successful, the latter is the return value of the concurrent run
print(res)
print("Czhenya's concurrent program")
-- continue running the concurrent process without passing arguments, and even if you do, only use the first passed argument
coroutine.resume(cor)
-- state of the concurrent process suspended running date
print(coroutine.status(cor)) 
--coroutine cannot be restarted after it has finished running
coroutine.resume(cor) 
--[[ The output is.
30
true
Czhenya's concurrent process
-10
dead
--]]

概要

以上が本記事の内容の全てです、皆様の勉強やお仕事のために本記事の内容が一定の参考学習価値を持つことを願っています、BinaryDevelopをよろしくお願いします。もっと詳しく知りたい方は、以下のリンク先をご確認ください。