嗨,需要一些关于我的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
协程后,需要结合使用resume
和yield
调用。 -
startServer
不需要是一个协程,因为您不会将控制权交还给它;它的唯一目的是启动服务器。
在您的情况下,解决方案甚至可能不需要协程,因为您需要做的就是:(1) 启动服务器并让它与进程分离(例如,使用 popen
)和 (2) 使用所需的任何通信协议(管道、套接字等)处理进程。
有更复杂和完整的解决方案(如LuaLanes),还有一些关于创建简单协程调度程序的良好描述。
您的协程不产生