2012-02-28 22 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 pthreadsのように、Lua用のマルチスレッドソリューションを提供する必要があります(コルーチンではないため、マイクロスレッドなので!)。

5

あなたは、あなたの問題にいくつかのソリューションを持っている:

  1. は、ご使用のオペレーティング・システム・シェルに応じて、あなたは、バックグラウンドにタスクを置くために&を使用する場合があります。たとえば:os.execute('(sleep 10&& echo bar) & echo foo')
  2. Lua Posixは、(Luaの文脈で「スレッド」は通常を指していることに注意してくださいあなたはLuaの中でのマルチスレッド化できますので、あなただけの別のレーンでos.executeを使用することができるかもしれませんposix.fork()機能
  3. Lua Lanesが付属していますネイティブOSスレッドの代わりにコルーチンを使用します)。

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

    これは、手術システムで動作するはずです:

2

は、単にあなたのコマンドの末尾に&を追加してみてください。窓には同じものへの道があるかもしれないが、私はそれが何であるか分からない。

+0

は、それはまた、(少なくとも7)Windows上で動作するようです – jpjacobs

関連する問題