Multithreading 尝试为协程Lua创建一个进程类

Multithreading 尝试为协程Lua创建一个进程类,multithreading,object,process,lua,coroutine,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

我想找出一种方法来创建一个对象,将一个函数传递给它,将它发送给一个协同程序,然后使用一些函数,比如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
这将通过传递名称和函数来初始化进程。我想在下面补充一些方法。(这就是我需要帮助实施的地方)

使用函数变量“self.func”创建一个协程,然后启动该协程。我在start函数中有初始化功能,因此可以多次运行。这就是我遇到麻烦的地方

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

谢谢你的帮助。谢谢

你不能这么做,因为协同程序是一种协作多任务的形式。这意味着每次只运行一个协同程序,将控制权从正在运行的协同程序转移回来的唯一方法是,协同程序本身在适当的时间点上进行
yield

您非常接近。协程是协作线程,因此传递给进程的函数必须调用coroutine.yield(理想情况下,经常调用)。进程还需要resume(),这样“线程”可以做更多的工作。在不执行协程的情况下,可以随时从协程外部停止协程:只要不恢复它,就可以取消它。它可以通过不让步而返回的方式随时从协同程序中停止。它看起来像这样(没有测试bug):

请务必阅读LuaRef手册,了解如何使用coroutine.yield构造函数,以及有关coroutine模块的详细信息

您可以有多个线程:

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中不可用;睡眠只是用来说明一个功能,它需要花费大量的时间去做一些可以分解成许多小块的事情

谢谢,有没有一种方法可以让我创建两个实例,然后启动它们(一个是无限循环,另一个是定时循环),这意味着它们都需要同时运行。上面的代码可能会出现这种情况吗?在>self.resume()行中,只有一个bug,需要使用:syntax>self:resume()调用它。但这不是问题所在,我希望能够创建多个实例并一次启动多个实例,因为我有需要线程的循环..Thx,更正,我扩展了第一条注释的答案,如果仍然不清楚,请发布注释。那么对于第二个func1函数,需要调用p1:resume()100次吗?yeild是否停止等待恢复?@user3214283是只要函数
func1
点击
yield
它就会返回,因此
p1:resume
也会在此时返回。对
p1:resume()
的调用只有在
产生
或在
func1
中返回后才能返回。您有更好的方法吗?
function func1()
    sleep(100) -- seconds
end
function func1()
    for i=1,100 do 
         sleep(1)
         coroutine.yield()
    end
end