LuaLanes 无法在单个通道中传递全局变量。

希望你过得愉快。

我过去几天一直在用 Lua 编程实现 IRC 聊天机器人,现在我想开始将多服务器支持加入其中。

到目前为止,我已经创建了 irc “对象”来管理每个服务器以及所有愉快的事情。现在,我面临的问题是线程问题。

如你所知,Lua没有内置线程支持。LuaLanes 和 LuaThreads 似乎是我想使用的最接近的库。我选择 LuaLanes 的原因是因为 LuaThreads 需要修改 Lua 核心。另外,LuaLanes 的 “lindas” 功能也吸引了我的注意(以供插件在以后使用)。

无论如何,我所面临的问题是:当使用 middleman 函数生成一个 lane(例如),然后调用另一个函数 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])

会显示一个错误:

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 机器人开发! :(

原文链接 https://stackoverflow.com/questions/6179936

点赞
stackoverflow用户44740
stackoverflow用户44740
将`sqr`变为本地函数就可以解决问题了。因为它成为了`middleman`的Upvalue,所以会被复制到新的lane中。

require 'lanes'

local function sqr() print(5*5) end

function middleman() sqr() end

gen = lanes.gen({globals = _G}, middleman)

print(gen()[1])

```

但肯定有一些奇怪的事情发生了。我的意思是,即使显式地将“sqr”和“print”传递给新的lane,当被“sqr”调用时,它仍然看不到“print”。似乎在lane之间序列化函数时有些问题。您应该联系其维护人员

2011-05-30 23:34:54