Concurrency 多并发进程
我想从lua脚本并发执行多个进程,例如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提供一个多线程解决方案(不是协程,因为它们是微线程!),例如。您的问题有几种解决方案: 根据您的操作系统外壳,您可以使用&将
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()
函数尝试在命令末尾添加(&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