【问题标题】:LuaLanes Unable to pass global variables between functions (in a single lane)LuaLanes 无法在函数之间传递全局变量(在单个通道中)
【发布时间】:2011-05-30 19:12:49
【问题描述】:

希望你今天过得愉快。

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

【问题讨论】:

    标签: multithreading lua lua-lanes


    【解决方案1】:

    sqr 设为本地可以解决问题。既然变成了中间人的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”传递到新车道,它也不会看到“print”(当被“sqr”调用时)。在我看来,在通道之间序列化功能时,某些东西无法正常工作。你应该联系它的maintainer

    【讨论】:

    • \o/ 非常感谢!非常感谢。诚然,将所有内容都本地化但仍然可用,这将是一种轻微的痛苦,但很高兴知道一种解决方法。 (我说谢谢了吗?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多