我想找出一种方法来创建一个对象,方法是向其中传递一个函数,将其发送到协程,然后使用一些函数,例如 start() stop() 和 status() 它可能看起来像这个,但我不知道如何实现。
local Process = {}
Process.__index = Process
function newProcess(name,func)
local self = setmetatable({}, Process)
self.name = name
self.func = func
return self
end
这只会通过传递名称和函数来初始化进程。我也想在下面添加一些方法。 (这是我需要帮助实现的地方)
function Process:start()
self.thread = -- create coroutine here
self.thread -- Resume the coroutine here
end
使用函数变量“self.func”创建一个协程,然后启动该协程。我在启动函数中进行了初始化,因此可以多次运行。这就是我遇到麻烦的地方
function Process:stop()
-- Stops the running coroutine (shutdown or in case i need to end i)
end
我将来可能非常需要这个,但我不知道如何实现它。基本上使用上面创建的 self.thread 变量
function Process:status()
-- Maybe return the coroutine.status?
end
感谢您的帮助。谢谢!
最佳答案
你们很接近。协程是协作线程,因此传递给进程的函数必须调用 coroutine.yield (理想情况下,经常调用)。 Process 还需要resume(),以便“线程”可以做更多的工作。协程可以在不执行协程的情况下随时从协程外部停止:只是不要恢复它,并将其置零。它可以在协程内随时通过不让出而是返回来停止。它看起来像这样(未测试错误):
function Process:start()
self.thread = coroutine.create(self.func)
self:resume() -- run to next yield
end
function Process:resume()
coroutine.resume(self.thread)
end
function Process:stop() -- from "outside" thread
self.thread = nil
end
function Process:status()
return coroutine.status(self.thread)
end
请务必查看 Lua 引用手册 sections 2.11例如如何使用 coroutine.yield 构造函数,以及 section 5.2有关协程模块的详细信息。
你可以有多个线程:
function func1() ... end
function func2() ... end
p1 = newProcess("func1", func1)
p2 = newProcess("func2", func2)
p1:start() -- runs func1 to its first yield
p2:start() -- runs func2 to its first yield
p1:resume() -- runs func1 to its second yield
p2:resume() -- runs func2 to its second yield
请注意,如果您有 func1,则上述内容将不起作用:
function func1()
sleep(100) -- seconds
end
但如果 func1 是这样的,它就会起作用:
function func1()
for i=1,100 do
sleep(1)
coroutine.yield()
end
end
两者休眠的时间相同(100秒),但第一个版本仅在100秒后返回,而第二个版本可以被调用100次,这给出了与单核多线程相同的结果。注意:sleep是伪代码,Lua中没有; sleep 仅用于说明需要花费大量时间来完成可分解为许多小块的操作的函数。
关于multithreading - 尝试为协程Lua制作一个进程类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534754/