良い一日をお過ごしください。
ここ数日、Lua で IRC チャットボットをプログラミングしてきましたが、ついに複数サーバー サポートの実装を開始したいと考えています。
これまでのところ、各サーバーを管理するための irc "オブジェクト" を作成しましたが、これまでのところ、スレッド化に問題があります。
ご存じのとおり、Lua にはスレッド サポートが組み込まれていません。ライブラリに関しては、LuaLanes と LuaThreads が、私が使いたかったものに最も近いように思えました。私が LuaLanes を選んだ理由は、LuaThreads には変更された lua コアが必要だからです。さらに、LuaLanes の "lindas" 機能が私の目を引きました (後でプラグインで使用するため)。
とにかく、私が抱えている問題は、関数を使用してレーンを生成しmiddleman(たとえば)、別の関数を呼び出す場合ですsqr(たとえば)。のような関数を生成するとlanes.gen({globals = _G}, middleman)、仲介者は現在のグローバルスコープ内のすべてにアクセスできます。これはまさに私が望んでいることです。問題は、 をmiddleman呼び出してグローバル スコープの何かsqrを使用すると、突然空になったsqrかのようにエラーがスローされることです。_G
上記の例を使用して、一緒に投げることができたコードの例を次に示します。
require 'lanes'
function sqr()
print(5*5)
end
function middleman()
sqr()
end
gen = lanes.gen({globals = _G}, middleman)
print(gen()[1])
次のエラーが表示されます。
tc@box:~$ lua lanestrouble.lua
lua: lanestrouble.lua:4: attempt to call global 'print' (a nil value)
stack traceback:
[C]: in function 'error'
./lanes.lua:190: in function <./lanes.lua:136>
lanestrouble.lua:13: in main chunk
[C]: ?
threading.c 399: pthread_cond_destroy(ref) failed, 16 EBUSY
Aborted
tc@box:~$
(ちなみにLinuxを使っています)
ただし、11 行目を からgen = lanes.gen({globals = _G}, middleman)に変更するとgen = lanes.gen({globals = _G}, sqr)、正常に動作します。
チェックしたところ、「*」(または「libs_str」パラメーターの他のオプション)を渡してデフォルトのライブラリをロードすると、同じことが起こります。
Lua 用の Java のスレッド ライブラリのようなものがあればいいのにと思います。それが私が最初にスレッドの使い方を学んだ方法です。(私が思う最も理想的な環境ではありません)
ありがとう、助けてくれてありがとう。特に、これは私の IRC ボット開発を完全に停止させてしまったので! :(