Lua分支并发进程

我想从一个 Lua 脚本中同时执行后台进程,例如:

a = io.popen("deploy.exp" .. ip1):read("*a")
b = io.popen("deploy.exp" .. ip2):read("*a")

其中 a 和 b 是持续运行的进程。但是,按照上述方式执行时,b 会等到 a 完成后才运行。而 deploy.exp 脚本是一个 expect 脚本,用于 ssh 到几台服务器并执行一些命令,然后我需要从 a 和 b 中获取一些文本。有什么好的建议吗?我尝试了 ExtensionProposal API。当我尝试时,我会收到一个错误消息,内容是: "\* glibc detected _free(): invalid next size (fast): 0x08aa2300 *_\* abort"。

相关的代码如下:

for k,v in pairs(single) do
command =  k .. " 1 " ..  table.concat(v, " ")
local out = io.pipe()
local pro = assert(os.spawn("./spaw.exp " .. command,{
      stdout = out,
}))
if not proc then error("Failed to aprogrinate! "..tostring(err)) end
print(string.rep("#", 50))
local exitcode = proc:wait()
end

有没有任何相关经验(或建议/应该查找的地方)可以帮助解决这个问题?或者能否给我提供一个示例?谢谢

顺便说一下:我尝试了 luaposix,但是找不到任何由 posix.fork() 支持的示例。有人可以分享一个吗?谢谢

点赞
用户847349
用户847349

您可能想要尝试 Lua Lanes(或从这里),这是一个适用于Lua的可移植线程库。

2012-11-05 09:14:14
用户1516484
用户1516484

posix.fork()luaposix 库 的一部分,可以通过 luarocks 安装。它的工作方式与 fork(3) 类似;它创建了父进程的副本,它们两个将执行 fork() 调用之后的所有内容。fork() 的返回值为 0 表示子进程,否则它就是刚刚产生的子进程的 PID。这里是一个假象的例子:

local posix = require "posix"
local pid = posix.fork()

if pid == 0 then
  -- 这是子进程
  print(posix.getpid('pid') .. ": child process")

else
  -- 这是父进程
  print(posix.getpid('pid') .. ": parent process")

  -- 等待子进程结束
  posix.wait(pid)

end

-- 两个进程都到这里
print(posix.getpid('pid') .. ": quitting")

这应该输出类似以下内容:

$ lua fork.lua
27219: parent process
27220: child process
27220: quitting
27219: quitting
2012-11-07 19:14:09