gpt4 book ai didi

multithreading - 试图为协程 Lua 创建一个进程类

转载 作者:行者123 更新时间:2023-12-03 13:00:21 24 4
gpt4 key购买 nike

我想找出一种方法来通过将函数传递给对象来创建对象,将其发送到协程,然后有一些函数,例如 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() 所以“线程”可以做更多的工作。协程可以随时从协程外部停止,同时不执行协程:只是不要恢复它,然后将它设为 nil。它可以在协程中随时通过不让步而是返回来停止。它看起来像这样(未测试错误):

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

两者的 sleep 时间相同(100 秒),但第一个版本仅在 100 秒后返回,而第二个版本可以调用 100 次,这与单核多线程的结果相同。注意:sleep 是伪代码,在 Lua 中没有;而 sleep 仅用于说明需要花费大量时间来执行可以分解为许多小块的功能的功能。

关于multithreading - 试图为协程 Lua 创建一个进程类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com