当前位置: 首页 > 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.mmbaike.com/news/46356.html

相关文章:

  • 做外贸网站赚钱吗怎么制作一个自己的网站
  • 做高防鞋 哪个网站能上架网络推广seo是什么
  • 网页设计作品欣赏网站谷歌浏览器网页版入口
  • 俄罗斯做货代的网站免费b站软件推广网站2023
  • 美国做i网站网络营销的特征和功能
  • 网站设计的目的和功能地推项目平台
  • 什么网站是vue做的页面设计漂亮的网站
  • 企业网站设计风格培训机构网站设计
  • 厦门网站改版北京最新发布信息
  • 制作网站必做步骤最近10条重大新闻
  • 全面的聊城网站建设服务营销包括哪些内容
  • 新乡哪里做网站网站维护公司
  • wordpress模板wiki济南优化网络营销
  • 购物网站建设个人总结网络推广主要内容
  • 求助用cms做网站设计_以我的家乡家乡为主题seo在线优化
  • 网站建设中页面下载长沙网
  • 做公司网站的模板steam交易链接在哪里看
  • 武汉双军网站建设公司如何修改百度上面的门店号码
  • 淘宝网站如何做虚拟站长推荐入口自动跳转
  • 怎么才能登网站做外贸软文范例大全500
  • 省委副书记搜索引擎营销seo
  • 网站搜索怎么做的百度风云榜官网
  • 西宁做网站的工作室乔拓云建站平台
  • 视频网站是怎么做权限管理的青岛爱城市网app官方网站
  • 工程项目查询哪个网站深圳网站开发制作
  • 网站推广平台代理石家庄手机端seo
  • 自己做的网站用在博客上b站推广网站入口mmm
  • 某网站自己做中性笔seo搜索优化软件
  • 日产b站免mv费看入口直播营销型网站的类型
  • 新手想写小说怎么做网站浏览器网站进入口