3

希望你今天过得愉快。

过去几天我一直在用 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 机器人开发!:(

4

1 回答 1

4

使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”传递到新车道,它也不会看到“print”(当被“sqr”调用时)。在我看来,在通道之间序列化函数时某些东西无法正常工作。你应该联系它的维护者

于 2011-05-30T23:34:54.443 回答