4

嗨,我的 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() )
4

3 回答 3

7

Lua 有协作多线程。线程不会自动切换,但必须yield切换到其他线程。当一个线程正在运行时,其他所有线程都在等待它完成或屈服。本例中的第一个线程似乎正在运行server.exe,我假设它在被中断之前永远不会完成。因此,第二个线程永远不会轮到它运行。

你也运行错误的线程。在您的示例中,您根本没有运行任何线程。您执行函数,然后尝试使用其输出创建协程,这自然会失败。但是由于您永远不会回来,server.exe因此您还没有注意到这个问题。之后移除这些支架startServercontinue进行修复。

于 2013-09-23T13:34:09.143 回答
3

如前所述,脚本有几个问题会阻止您获得所需的内容:

  • os.execute("...")在命令完成之前被阻塞,并且在您的情况下它没有完成(因为它运行无限循环)。解决方案:您需要使用类似的东西io.popen()而不是os.execute()
  • co = coroutine.create( startServer() )在您的情况下不会创建协程。coroutine.createcall 接受一个函数引用,并将startServer调用的结果传递给它,即nil. 解决方案:使用co = coroutine.create( startServer )(注意括号被去掉了,所以不再是函数调用了)。
  • 你没有从你的协程中让步;如果您希望多个协程一起工作,它们需要在适当的时候通过相互控制来进行合作。这就是yield命令的用途,这就是为什么它被称为非抢占式多线程解决方案:您需要在您的协程之后使用resumeyield调用的组合create
  • startServer不需要成为协程,因为您没有将控制权交还给它;它的唯一目的是启动服务器。

在您的情况下,解决方案甚至可能不需要协程,因为您需要做的就是:(1)启动服务器并让它与您的进程分离(例如,使用popen)和(2)使用任何通信协议与您的进程一起工作它需要(管道、插座等)。

有更复杂和完整的解决方案(如LuaLanes)以及关于创建简单协程调度程序的几个很好的描述。

于 2013-09-23T16:36:01.527 回答
0

你的协程没有产生

于 2013-09-23T13:33:33.063 回答