Lua多并发进程

我想在 Lua 脚本中同时执行多个进程,例如:

os.execute("cmd1")
os.execute("cmd2")
os.execute("cmd3")

其中 cmd1、2 和 3 都是正在运行的进程。当我像上面那样执行时,cmd2 和 3 只有在 cmd1 完成后才会运行。有什么好的建议吗?我应该使用“fork”或其他等效方法吗?

提前感谢。

原文链接 https://stackoverflow.com/questions/9480315

点赞
stackoverflow用户233522
stackoverflow用户233522

因为 Lua 是单线程的,所以要同时运行 Lua 就需要为其提供多线程解决方案(不是协程,因为它们是微线程!)例如 lua pthreads

2012-02-28 10:46:24
stackoverflow用户513763
stackoverflow用户513763

以下是你解决问题的几种方法:

  1. 根据你的操作系统 shell,你可以使用 & 将任务放在后台运行。例如:os.execute('(sleep 10&& echo bar) & echo foo')
  2. Lua Posix 包含一个 posix.fork() 函数
  3. Lua Lanes 在 Lua 中提供了多线程,因此你可能只需在不同的线程中使用 os.execute(请注意,在 Lua 上下文中,“线程”通常指的是协程而不是原生的操作系统线程)。
2012-02-28 10:46:50
stackoverflow用户312586
stackoverflow用户312586

尝试在你的命令末尾简单地添加&符号:

os.execute("cmd1 &")
os.execute("cmd2 &")
os.execute("cmd3 &")

这应该适用于一个操作系统。在Windows上可能有一种方法可以实现相同的效果,但我不知道它是什么。

2012-02-28 13:42:26
stackoverflow用户837856
stackoverflow用户837856

ExtensionProposal API 中有一个 os.spawn 函数。

您可以按照以下方式使用它:

require"ex"
local proc, err = os.spawn{
    command = e.."/bin/aprogr",
    args = {
        "arg1",
        "arg2",
        -- 等等
    },
    env = {
        A = 100, -- 我假设它对值进行了字符串化
        B = "Hi",
        C = "Test",
    },
    -- 您还可以指定 stdin、stdout 和 stderr
    -- 有关更多信息,请参见提案页面
}
if not proc then
    error("Failed to aprogrinate! "..tostring(err))
end

-- 如果您想等待进程完成:
local exitcode = proc:wait()

lua-ex-pai 提供了 POSIX 和 Windows 的实现。 它允许同时生成多个进程。

您可以在 LuaForWindows 发行版中找到此实现的预编译二进制文件。

这是您用例的更简洁版本:

require"ex"
local cmd1_out = io.pipe()
local cmd1_proc = assert(os.spawn("cmd", {
    stdout = cmd1_out,
}))
local cmd2_out = io.pipe()
local cmd2_proc = assert(os.spawn("cmd", {
    stdout = cmd1_out,
}))
-- 使用 cmd1 和 cmd2 执行操作
2012-02-29 01:21:40