gpt4 book ai didi

multithreading - LuaLanes 无法在函数之间传递全局变量(在单 channel 中)

转载 作者:行者123 更新时间:2023-12-03 12:45:44 28 4
gpt4 key购买 nike

希望你今天过得愉快。

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

最佳答案

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”明确传递到新 channel ,它也不会看到“print”(当被“sqr”调用时)。在我看来,在 channel 之间序列化函数时有些东西不正常。你应该联系它的maintainer .

关于multithreading - LuaLanes 无法在函数之间传递全局变量(在单 channel 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6179936/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com