2012-02-28 61 views
2

我想要從一個lua腳本併發地執行多個進程,例如,Lua多個併發進程

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

其中cmd1,2和3是連續運行的過程。當我這樣做時,cmd2和3只會在cmd1完成時運行。對此有何想法?我應該使用「叉子」還是等同的東西?

在此先感謝

回答

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

這是因爲Lua是單線程。要同時運行它,你需要爲Lua提供一個多線程解決方案(不是協同程序,因爲它們是微線程!),如lua pthreads

5

你有幾種解決方案,您的問題:

  1. 根據您的操作系統的外殼,你可能會使用&把任務放到後臺。例如:os.execute('(sleep 10&& echo bar) & echo foo')
  2. Lua Posix自帶posix.fork()功能
  3. Lua Lanes讓你在Lua多線程,那麼你也許可以只使用在不同的車道os.execute(注意,「線」在一個Lua方面通常是指協程而不是本地操作系統線程)。
2

嘗試只需在命令的末尾添加&:

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

這應該一個操作的系統上運行。在窗戶上可能會有一種方法,但我不知道它是什麼。

+0

似乎也適用於Windows(7至少) – jpjacobs 2012-02-28 13:46:33