希望您度過愉快的一天。LuaLanes無法在函數之間傳遞全局變量(在單個通道中)
過去幾天我一直在Lua編寫一個IRC聊天機器人,最後我想開始在其中實現多個服務器支持。
到目前爲止,我已經創建了irc「object」來管理每個服務器以及所有這些快樂的東西 - 現在,我遇到了線程問題。
如你所知,Lua沒有內置的線程支持。就圖書館而言,LuaLanes和LuaThreads似乎與我想使用的最接近。是什麼讓我選擇LuaLanes是因爲LuaThreads需要修改lua核心。再加上LuaLane的「lindas」特性引起了我的注意(以後用於插件)
無論如何,我遇到的問題是當您使用函數middleman
(例如)生成一個通道時,然後調用另一個函數sqr
(例如)。如果你生成的功能如lanes.gen({globals = _G}, middleman)
,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])
產生一個錯誤說:
[email protected]:~$ 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
[email protected]:~$
(順便說一句,我使用的Linux)
但是,如果您將第11行從gen = lanes.gen({globals = _G}, middleman)
更改爲gen = lanes.gen({globals = _G}, sqr)
,它工作正常。
我已經檢查過,如果您通過「*」(或「libs_str」參數的任何其他選項)加載默認庫,也會發生同樣的情況。
我真的希望有一些像Lua的Java線程庫,這就是我最初學習如何使用線程。 (我知道,不是我想的最理想的環境)
謝謝,我很感謝幫助。特別是因爲這完全停止了我的IRC bot開發! :(
\ o/Thanks a ton!非常感謝。無可否認,將所有東西都放在本地但仍然可用, o知道解決方法。 (我說謝謝?) – FurryHead 2011-06-01 20:22:48