希望你今天过得愉快。
过去几天我一直在用 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”参数的任何其他选项)来加载默认库,也会发生同样的事情。
我真的希望有类似 Java 的 Lua 线程库之类的东西,这就是我最初学习使用线程的方式。(我知道,不是我想的最理想的环境)
谢谢,我非常感谢帮助。特别是因为这完全停止了我的 IRC 机器人开发!:(