2013-09-23 102 views
4

你需要我的lua腳本的一些幫助。我有一個腳本在這裏運行一個像應用程序(無限循環)的服務器。這裏的問題是它不執行第二條協程。Lua腳本協程

你能告訴我什麼是錯的謝謝。

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解決方案:您需要使用resumeyield組合後調用create您的協同程序。
  • startServer不需要是協同程序,因爲您不控制它;它唯一的目的是啓動服務器。

在你的情況下,解決方案可能甚至不需要協同程序,因爲所有你需要做的是:(1)啓動服務器,讓它從你的進程分離(例如,使用popen)和(2)工作與您的進程使用它需要的任何通信協議(管道,套接字等)。

還有更復雜和完整的解決方案(如LuaLanes)以及關於創建simple coroutine dispatchers的幾個很好的描述。

0

你的協同程序沒有產生

7

Lua中有合作的多線程。線程不會自動切換,但必須給其他人使用yield。當一個線程正在運行時,其他每個線程都在等待它完成或退出。你在這個例子中的第一個線程似乎運行server.exe,我認爲,直到中斷纔會結束。因此第二個線程永遠不會運行。

你也運行線程錯誤。在你的例子中,你根本沒有運行任何線程。你執行函數,然後嘗試用它的輸出創建協程,這自然會失敗。但既然你永遠不會從server.exe回來,你還沒有注意到這個問題。刪除startServercontinue後面的括號來修復它。

+0

您好,感謝您的快速回復,我怎麼能讓它成爲其他人? – inn

+0

嗨,我想我現在明白了。所以它必須等待服務器停止,然後我的第二個腳本纔會運行?有沒有其他的方式來同時運行這兩個腳本? – inn

+3

是的。 'server.exe'應該從控制檯中取消以允許'os.​​execute'返回。或者,使用Windows的方法在單獨的窗口中運行它,即'os.execute('cmd/c start'server「server.exe')'。 –