kehuadong

lua协程

local coroutine = coroutine
local table = table

local coroutine_create = coroutine.create
local coroutine_resume = coroutine.resume
local coroutine_yield = coroutine.yield

local tremove = table.remove

local coroutine_pool = setmetatable({}, { __mode = "kv" })

local function co_create(f)
	local co = tremove(coroutine_pool)
	if co == nil then
		print('new co')
		co = coroutine_create(function(...)
			f(...)
			while true do
				-- recycle co into pool
				f = nil
				coroutine_pool[#coroutine_pool+1] = co

				-- recv new main function f
				f = coroutine_yield()
				f(coroutine_yield())
			end
		end)
	else
		print('resume co')
		coroutine_resume(co, f)
	end
	return co
end

local co = co_create(print)
coroutine_resume(co, 'hello world')

co = co_create(print)
coroutine_resume(co, 'hello world')

 

posted on 2022-11-09 14:54  kehuadong  阅读(17)  评论(0编辑  收藏  举报

导航