multithreading - 尝试为协程Lua制作一个进程类

标签 multithreading object process lua coroutine

我想找出一种方法来创建一个对象,方法是向其中传递一个函数,将其发送到协程,然后使用一些函数,例如 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/

相关文章:

c++ - 无法为 Netbeans 启用 pthread

multithreading - 我不明白信号量和锁之间的区别

c# - 在字典中存储对对象的引用

javascript - 如何检查 Javascript 对象数组是否始终具有相同的值

java - 如何知道以 "cmd start"启动的进程的状态?

java - 使用 JNA 获取正在运行的进程

java - 计时器在指定时间后继续

.net - 将记录标记为 'in use' 以支持多线程

javascript - polyyne 对象的空属性?

azure - 是否可通过 Windows Azure Pack 或 App Fabric 获取适用于本地解决方案的 Azure 辅助角色