Lua несколько параллельных процессов - PullRequest
2 голосов
/ 28 февраля 2012

Я хочу выполнить несколько процессов одновременно из сценария lua, например,

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

, где cmd1,2 и 3 - это постоянно запущенные процессы.Когда я делаю это, как указано выше, cmd2 и 3 будут работать только после завершения cmd1.Есть идеи по этому поводу?Должен ли я использовать «вилку» или что-то подобное?

Заранее спасибо

Ответы [ 4 ]

5 голосов
/ 28 февраля 2012

У вас есть несколько решений вашей проблемы:

  1. В зависимости от оболочки вашей операционной системы, вы можете использовать & для перевода задач в фоновый режим.Например: os.execute('(sleep 10&& echo bar) & echo foo')
  2. Lua Posix поставляется с posix.fork() функцией
  3. Lua Lanes обеспечивает многопоточность в Lua, так что вы можетеуметь просто использовать os.execute в отдельных дорожках (обратите внимание, что «потоки» в контексте Lua обычно ссылаются на сопрограммы, а не на собственные потоки ОС).
3 голосов
/ 29 февраля 2012

(ответ в основном скопирован из Вызов с открытым окружением )

В API ExtensionProposal есть функция 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 .

Вот более краткая версия вашего использованияcase:

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 голосов
/ 28 февраля 2012

Попробуйте просто добавить & в конце своих команд:

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

Это должно работать в операционной системе.На окнах может быть способ к тому же, но я понятия не имею, что это такое.

2 голосов
/ 28 февраля 2012

Это потому что Lua однопоточный.Чтобы запустить его одновременно, вам нужно предоставить многопоточное решение для Lua (не сопрограмм, потому что они являются микропотоками!), Например lua pthreads .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...