当前位置: 首页 > news >正文

南京微信网站建设哪家好公司注册网上申请网站

南京微信网站建设哪家好,公司注册网上申请网站,有好的学网站建设的书吗,安卓市场网站建设封装 go 函数 在 使用 Lua 协程处理异步回调函数 中已经介绍 这里简要列下: 封装 go 函数---go 函数创建并启动一个协程 ---param _co_task function 函数原型 fun(_co:thread) function go(_co_task)local co coroutine.create(_co_task) -- 创建的协程是暂停的…

封装 go 函数

在 使用 Lua 协程处理异步回调函数 中已经介绍

这里简要列下:

  1. 封装 go 函数
    ---go 函数创建并启动一个协程
    ---@param _co_task function @函数原型 fun(_co:thread)
    function go(_co_task)local co = coroutine.create(_co_task) -- 创建的协程是暂停的coroutine.resume(co, co)              -- 调用 coroutine.resume 激活协程执行
    end
    
  2. 封装项目中异步函数
    ---封装 c_model.c_foo 异步函数,成为协程函数
    ---@param _co thread @协程对象
    ---@return boolean,string
    function co_foo(_co)c_model.c_foo(function(_ok, _result)coroutine.resume(_co, _ok, _result) -- 2. 回调函数被调用后,激活本协程继续执行。并把_ok, _result传递给 yieldend)return coroutine.yield()                -- 1. 主动放弃运行,本协程被切换出去
    end
    
  3. 使用例子
    ---test顺序编写代码,解决回调函数造成同块逻辑被撕裂的例子
    ---@param _co thread @协程对象
    function test(_co)for i = 1, 10, 1 dolocal ok, result = co_foo(_co) -- co_foo 会先 yield 切出;内部回调被执行时, resume 重新切回来继续执行print(ok, result)end
    end-- 启动 test 协程
    go(test)
    

封装 defer

defer 的特点有以下:

  • 协程正常退出能被执行
  • 协程异常退出能被执行
  • 同个协程内可以多次调用 defer
  • defer 被执行时,按出栈顺序被执行
defer 多次执行

首先定义 defer 函数,让它具备能多次被调用:

function defer(_co_wrap, h)table.insert(_co_wrap.defer_handlers, h)
end

因为要对 defer 的函数句柄做保持,以便退出时执行。包裹了下 co 对象:

---@class co_wrap
---@field co thread
---@field defer_handlers fun(_co_error:co_error)[]

同时定义下让 defer 的函数知道是否有错误的对象:

---@class co_error
---@field ok boolean
defer 被执行时,按出栈顺序被执行
function invoke_defer_handlers(_co_wrap, _co_error)for i=#_co_wrap.defer_handlers, 1, -1 dolocal h = _co_wrap.defer_handlers[i]xpcall(h, function(err) print(err) end, _co_error)end
end
协程异常时,能被执行

Lua 协程异常,通过 coroutine.resume 捕获,并返回错误信息

因此主要封装下 coroutine.resume :

function coroutine_resume(_co_wrap, ...)local ok, errmsg = coroutine.resume(_co_wrap.co, ...)if not ok theninvoke_defer_handlers(_co_wrap, {ok=false}) -- 异常退出end
end
协程正常退出时,能被执行
function go(_co_task)local co = coroutine.create(function(_co_wrap)_co_task(_co_wrap)invoke_defer_handlers(_co_wrap, {ok=true}) -- 正常退出end)local cowrap = { co = co, defer_handlers = {} } ---@type co_wrapcoroutine_resume(cowrap, cowrap) -- 初创建的协程是暂停的,手动触发执行
end

以上就可以在 Lua 中完全 Golang 的方式编写协程代码了

协程间通信

由于项目中暂时是一根线程管理一个 lua_state 对象,因此暂时无需求多线程中的协程间的通信需求

待续

http://www.yayakq.cn/news/285454/

相关文章:

  • 企业门户网站设计老五wordpress
  • 制作公司网站应该考虑什么wordpress怎么更新缓存
  • 百度搜到网站网站建设费需要列入无形资产吗
  • 国外设计网站pinterest下载h5页面制作网站易企秀
  • 上海快速网站建设男生学平面设计好就业吗
  • cf辅助如何做代理拿网站seo优质友链购买
  • 天津的公司能在北京做网站备案吗全新的装修设计
  • 怎么做用网站赚钱吗用哪个网站做首页好
  • 凡科网站代码怎么毕业设计网站建设英文文献
  • 爱爱做网站WordPress在线字体
  • 网站的备案号在哪上海网站公司排名
  • 浙江公司网站建设推广尤溪住房和城乡建设局网站
  • 农家乐网站设计费用17173游戏网官网
  • 外贸网站优化在线推广自贡网络推广
  • 网站工程师是做什么的免费海报图片大全
  • 目前做win7系统最好的网站产品线上推广渠道
  • 网站开发所遵循互联网行业推广员资格证明图片
  • 云浮住房和城乡建设部官方网站网站建设的准备工作
  • 秦皇岛市做公司网站的洛阳网站建设 恒凯科技
  • 小程序可做网站吗wordpress 选择中文
  • 棋牌 彩票网站建设做网站的话术
  • 杭州网站建设专家wordpress做专题
  • 新闻发稿平台有哪些?整站优化与关键词排名
  • 番禺网站建设方案微信营销典型案例
  • 求职网站的建设方案保定seo推广公司
  • 北京品牌网站建设公司排名兼职做美工摄影去哪个网站
  • 做网站像素大小户外旅游网站排名
  • 重庆自助建站系统哪家好wordpress后台错位
  • 可以免费进入的网站正能量域名宠物网站制作费用明细
  • 做网站前需要准备什么90后做网站赚了