过去几天我一直在Lua编写一个IRC聊天机器人,最后我想开始在其中实现多个服务器支持。
到目前为止,我已经创建了irc“对象”来管理每个服务器,以及所有那些快乐的东西 - 现在,我遇到了线程问题。
你可能知道,Lua没有内置的线程支持。就图书馆而言,LuaLanes和LuaThreads似乎最接近我想要使用的东西。是什么让我选择LuaLanes是因为LuaThreads需要一个修改过的lua核心。此外,LuaLanes的“lindas”功能引起了我的注意(以后在插件中使用)无论如何,我遇到的问题是当你使用函数middleman
生成一个通道时(例如),然后调用另一个函数sqr
(例如)。如果你生成像lanes.gen({globals = _G}, middleman)
这样的函数,midman将可以访问当前全局范围内的所有内容,这正是我想要的。问题是,如果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 bot开发! :(
答案 0 :(得分:3)
让sqr
本地化就可以了。由于它成为中间人的升值,它被复制到新的车道。
require 'lanes'
local function sqr()
print(5*5)
end
function middleman()
sqr()
end
gen = lanes.gen({globals = _G}, middleman)
print(gen()[1])
但绝对有些奇怪的事情正在发生。我的意思是,即使明确地将“sqr”和“print”传递给新车道,它也不会看到“打印”(当被“sqr”调用时)。在我看来,当在通道之间序列化函数时,某些东西不能正常工作。您应该联系maintainer。