Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 多并发进程_Concurrency_Process_Lua - Fatal编程技术网

Concurrency 多并发进程

Concurrency 多并发进程,concurrency,process,lua,Concurrency,Process,Lua,我想从lua脚本并发执行多个进程,例如 os.execute("cmd1") os.execute("cmd2") os.execute("cmd3") 其中,cmd1、2和3连续运行进程。当我如上所述执行此操作时,cmd2和CMD3将仅在cmd1完成时运行。有什么想法吗?我应该使用“fork”或类似的东西吗 提前感谢这是因为Lua是单线程的。要同时运行它,您需要为Lua提供一个多线程解决方案(不是协程,因为它们是微线程!),例如。您的问题有几种解决方案: 根据您的操作系统外壳,您可以使用&将

我想从lua脚本并发执行多个进程,例如

os.execute("cmd1")
os.execute("cmd2")
os.execute("cmd3")
其中,cmd1、2和3连续运行进程。当我如上所述执行此操作时,cmd2和CMD3将仅在cmd1完成时运行。有什么想法吗?我应该使用“fork”或类似的东西吗


提前感谢

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

您的问题有几种解决方案:

  • 根据您的操作系统外壳,您可以使用
    &
    将任务放到后台。例如:
    os.execute('(sleep 10&&echo bar)&echo foo')
  • 带有
    posix.fork()
    函数
  • 为您提供Lua中的多线程处理,因此您可以在单独的通道中使用os.execute(请注意,Lua上下文中的“线程”通常指协同路由,而不是本机os线程)

  • 尝试在命令末尾添加(&D):

    os.execute("cmd1 &")
    os.execute("cmd2 &")
    os.execute("cmd3 &")
    
    这应该在一个可操作的系统上起作用。在windows上,可能有一种方法可以达到同样的效果,但我不知道它是什么。

    (答案大部分是抄袭自)

    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()
    
    提供POSIX和Windows的实现。 它允许生成多个并发进程

    您可以找到与发行版捆绑在一起的此实现的预编译二进制文件

    以下是您的用例的更简明版本:

    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