Lua分叉并发进程

4
我希望能够从Lua脚本中并行执行后台进程。
例如:
a = io.popen("deploy.exp" .. ip1):read("*a")
b = io.popen("deploy.exp" .. ip2):read("*a")

其中a、b是持续运行的进程。当我按照上述方式操作时,只有在a完成后,b才会运行。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()的样例。有人能分享一下吗?谢谢。


“我找不到任何使用posix.fork()的示例。” 你不能简单地尝试一下,看看会发生什么吗? - Nicol Bolas
但我真的不知道它的用法。通过在网上搜索和阅读代码,经历了很多烦恼,但没有运气。 - ms2008
2个回答

3

posix.fork()是luaposix库的一部分,可以通过luarocks安装。它的工作方式与fork(3)类似;它创建了父进程的副本,两者都将执行调用fork()之后的所有内容。 fork()的返回值在子进程中为0,否则它是刚刚生成的子进程的PID。以下是一个人为构造的示例:

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

if pid == 0 then 
  -- this is the child process
  print(posix.getpid('pid') .. ": child process")

else 
  -- this is the parent process
  print(posix.getpid('pid') .. ": parent process")

  -- wait for the child process to finish
  posix.wait(pid) 

end

-- both processes get here
print(posix.getpid('pid') .. ": quitting")

这应该输出类似以下的内容:
$ lua fork.lua 
27219: parent process
27220: child process
27220: quitting
27219: quitting

1

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


1
这里是Lua的其他并发库的比较。 - Dmitry Ledentsov
这是关于编程的内容,翻译成中文如下:这里有一个针对lanes的示例(适用于LuaForWindows),链接在此:http://pastebin.com/934dhTni - Dmitry Ledentsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接