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() )

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

您也运行错误的线程。在您的示例中,您根本没有运行任何线程。你执行函数,然后尝试用它的输出创建协程,这自然会失败。但是由于您从未从server.exe回来,因此您还没有注意到这个问题。startServer后取下这些支架,continue修复它。

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

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

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

有更复杂和完整的解决方案(如LuaLanes),还有一些关于创建简单协程调度程序的良好描述。

您的协程不产生

最新更新