Multithreading LuaLanes无法在函数之间传递全局变量(在单个通道中)
希望你今天过得愉快 在过去的几天里,我一直在用Lua编写一个IRC聊天机器人,最后我想开始在其中实现多服务器支持 到目前为止,我已经创建了irc“对象”来管理每台服务器,以及所有令人高兴的事情——现在,我在线程方面遇到了问题 您可能知道,Lua没有内置线程支持。就图书馆而言,LuaLanes和LuaThreads似乎最接近我想要使用的东西。我之所以选择LuaLanes是因为LuaThreads需要一个经过修改的lua核心。加上LuaLanes的“lindas”特性吸引了我的眼球(供以后在插件中使用) 无论如何,我遇到的问题是,当您使用函数Multithreading LuaLanes无法在函数之间传递全局变量(在单个通道中),multithreading,lua,lua-lanes,Multithreading,Lua,Lua Lanes,希望你今天过得愉快 在过去的几天里,我一直在用Lua编写一个IRC聊天机器人,最后我想开始在其中实现多服务器支持 到目前为止,我已经创建了irc“对象”来管理每台服务器,以及所有令人高兴的事情——现在,我在线程方面遇到了问题 您可能知道,Lua没有内置线程支持。就图书馆而言,LuaLanes和LuaThreads似乎最接近我想要使用的东西。我之所以选择LuaLanes是因为LuaThreads需要一个经过修改的lua核心。加上LuaLanes的“lindas”特性吸引了我的眼球(供以后在插件中使
middleman
(例如)生成一条车道时,它会调用另一个函数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:~$
tc@box:~$lua lanestrouble.lua
lua:lanestrouble.lua:4:尝试调用全局“print”(一个nil值)
堆栈回溯:
[C] :在函数“error”中
/车道。lua:190:功能正常
lua:13:在主块中
[C] :?
threading.c 399:pthread_cond_destroy(ref)失败,16 EBUSY
流产
tc@box:~$
(顺便说一下,我正在使用linux)
但是,如果您将第11行从gen=lanes.gen({globals=\u G},middleman)
更改为gen=lanes.gen({globals=\u 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”传递到新车道时,它也不会看到“print”(当被称为“sqr”时)。在我看来,在车道之间序列化函数时,某些功能似乎不正常。您应该联系its。\o/非常感谢!非常感谢。诚然,将所有内容都本地化,但仍然可用,这将是一种轻微的痛苦,但知道一种解决方法很好。(我说了谢谢吗?)