Lua多个并发进程

时间:2012-02-28 10:34:14

标签: concurrency process lua

我想从lua脚本中同时执行多个进程,例如

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

其中cmd1,2和3持续运行进程。当我按上述方式执行此操作时,cmd2和3仅在cmd1完成时运行。有什么想法吗?我应该使用“fork”或类似的东西吗?

提前致谢

4 个答案:

答案 0 :(得分:5)

你有几个问题的解决方案:

  1. 根据您的操作系统shell,您可以使用&将任务放入后台。例如:os.execute('(sleep 10&& echo bar) & echo foo')
  2. Lua Posix附带posix.fork()函数
  3. Lua Lanes在Lua中为您提供多线程,因此您可以在单独的通道中使用os.execute(请注意,Lua上下文中的'threads'通常是指协同程序而不是本机OS线程)。 / LI>

答案 1 :(得分:3)

(主要是从 Call popen with environment 复制的答案)

ExtensionProposal API中有os.spawn个功能。

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

require"ex"
local proc, err = os.spawn{
    command = e.."/bin/aprogr",
    args = {
        "arg1",
        "arg2",
        -- etc
    },
    env = {
        A = 100, -- I assume it tostrings the value
        B = "Hi",
        C = "Test",
    },
    -- you can also specify stdin, stdout, and stderr
    -- see the proposal page for more info
}
if not proc then
    error("Failed to aprogrinate! "..tostring(err))
end

-- if you want to wait for the process to finish:
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,
}))
-- perform actions with cmd1 and cmd2

答案 2 :(得分:2)

那是因为Lua是单线程的。要同时运行它,你需要为Lua提供一个多线程解决方案(不是协同程序,因为它们是微线程!),如lua pthreads

答案 3 :(得分:2)

尝试简单地添加&在命令的最后:

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

这应该适用于操作系统。在Windows上可能会有相同的方法,但我不知道它是什么。