2013-09-23 3 views
4

Привет, мне нужна помощь по моему сценарию lua. У меня есть сценарий здесь, который будет запускать сервер, как приложение (бесконечный цикл). Проблема здесь в том, что она не выполняет вторую сопрограмму.Lua Script coroutine

Не могли бы вы рассказать мне, что случилось. Спасибо.

function startServer() 
    print("...Running server") 
    --run a server like application infinite loop 
    os.execute("server.exe") 
end 
function continue() 
    print("continue") 
end 

co = coroutine.create(startServer()) 
co1 = coroutine.create(continue()) 
+0

Если вы хотите узнать больше о многозадачности в Lua, вы можете прочитать мой ответ на предыдущий вопрос: http://stackoverflow.com/questions/15943785/thread-priorities-in-lua/15944052#15944052 – jbr

+0

Начните с чтения [PiL] (http://www.lua.org/pil/9.html) –

ответ

3

Как уже отмечалось, есть несколько вопросов, с помощью сценария, которые мешают вам получить то, что вы хотите:

  • os.execute("...") блокируется, пока команда не будет завершена, и в вашем случае это не полный (как это запускает бесконечный цикл). Решения: вам нужно отделить этот процесс от твоих, используя что-то вроде io.popen() вместо os.execute()
  • co = coroutine.create(startServer()) не создает сопрограмму в вашем случае. coroutine.create вызов принимает ссылку на функцию, и вы передаете ей результат вызова startServer, который является nil. Решение: использовать co = coroutine.create(startServer) (обратите внимание, что скобки опущены, так что это больше не вызов функции).
  • Вы не уступаете своим сопрограммам; если вы хотите, чтобы несколько сопрограмм работали вместе, они должны взаимодействовать, давая контроль друг другу, когда это необходимо. Вот что такое команда yield, и поэтому ее называют non-preemptive multithreading. вам нужно использовать комбинацию resume и yield звонки после вас create ваша сопрограмма.
  • startServer не обязательно должен быть сопрограммой, поскольку вы не даете ей контроля; его единственная цель - запустить сервер.

В вашем случае решение не может даже нужно сопрограмм как все, что вам нужно сделать, это: (1) запустить сервер, и пусть она отделилась от вашего процесса (например, с помощью popen) и (2) работа с вашим процессом, используя любой протокол связи, который он требует (трубы, сокеты и т. д.).

Есть более сложные и полные решения (например, LuaLanes), а также несколько хороших описаний при создании simple coroutine dispatchers.

7

Lua имеет кооперативную многопоточность. Нити не сбрасываются автоматически, но должны yield другим. Когда один поток запущен, каждый другой поток ожидает его завершения или выхода. Ваша первая нить в этом примере, кажется, работает server.exe, которая, я полагаю, никогда не заканчивается до тех пор, пока не прервется. Таким образом, вторая нить не запускается.

Вы также вносите неправильные потоки. В вашем примере вы вообще не запускаете ни одного потока. Вы выполняете функцию, а затем пытаетесь создать сопрограмму с ее выходом, что, естественно, потерпит неудачу. Но так как вы никогда не возвращались с server.exe, вы еще не заметили эту проблему. Удалите эти скобки после startServer и continue, чтобы исправить это.

+0

Привет, спасибо за быстрый ответ, как я могу уступить его другим? – inn

+0

Привет, мне кажется, я понял это сейчас. поэтому он должен ждать, пока сервер остановится, тогда мой второй скрипт будет запущен ?. Есть ли другой способ запускать оба сценария одновременно? – inn

+3

Да. 'server.exe' должен отключиться от консоли, чтобы вернуться к' os.execute'. В качестве альтернативы используйте средства Windows для запуска в отдельном окне, то есть 'os.execute ('cmd/c start" server "server.exe')'. –

Смежные вопросы