-- CPM:关键路径法(Critical Path Method)
jobBase = {
    schedule = function ( self, job, task, ... ) --由具体job构造任务列表
        local finale = false
        local msg = nil
        local rc = nil
        local params = table.pack(self, task, ...)
        repeat
            ];
            local fn = job[task]
            if type(fn) == "function"
            )) end
            finale = (task == "finale")
            msg = self.name.."["..task.."] done!"
            if not finale
            then
                -- yield 传回进度描述及任务反馈
                -- 打包调度入参
                params = table.pack(coroutine.yield(msg, rc))
            end
        until finale
        self.co = nil -- over
        return msg, rc
    end;
    perform = function ( self, task, ... )
        local co = self.co or coroutine.create(self.schedule)
        if self.co == nil
        then self.co = co end
        return coroutine.resume(co, self, task, ...)
    end;
}--jobBase
---------------------------------------------------------------
--记得华罗庚的统筹方法论对烧水泡茶的描述过程
--就是多任务协调的执行程序
--示例:project, another两项任务节点的调度与描述
--{}, 构造描述的脚本模式
local project = {
    name = "projectSample";
    perform = jobBase.perform;
    schedule = function ( self, task, ... )
        local todo = {
        ["stage1"] = function()
        end;
        ["stage2"] = function()
        end;
        ["stage3"] = function()
        end;
        ["finale"] = function()end;
        }
        return jobBase.schedule(self, todo, task, ...)
    end
}
--记得区分对象调用与域调用,一不小心就写成. 就无法识别self了
print(project:perform("stage1"))
--creator, object based; 基于创建对象,对象扩展的脚本模式
function jobBase.create( name )
    local o = {name = name}
    return setmetatable(o, {__index = jobBase})
end
local another = jobBase.create("anotherProject")
function another:schedule( task, ... )
    local todo = {
    ["stage1"] = function()
    end;
    ["stage2"] = function()
    end;
    ["finale"] = function()end;
    }
    return getmetatable(self).__index.schedule(self, todo, task, ...)
end
print(another:perform("stage1"))
print(project:perform("stage2"))
print(project:perform("stage3"))
print(another:perform("stage2"))
print(project:perform("finale"))
print(another:perform("finale"))

本贴代码重点,提示两种脚本应用模式。构造描述的对象模式;基于创建方法,对象扩展的脚本模式。

此例演示coroutine用于多任务协同,统筹方法的一种脚本描述。

[lua]协同式多任务,统筹运用的更多相关文章

  1. 使用KEIL C51实现的简单合作式多任务操作系统内核(单片机实现版本)

    基于网上网友的代码,自己在单片机上实现, 特此记录分享之. 基于https://blog.csdn.net/yyx112358/article/details/78877523 //使用KEIL C5 ...

  2. Lua 协同程序(coroutine)

    什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西. 协同是非常 ...

  3. Lua 学习之基础篇九<Lua 协同程序(Coroutine)>

    引言 讲到协程,首先来介绍一下线程和协程的区别 lua协程和多线程 相同之处:拥有自己独立的桟.局部变量和PC计数器,同时又与其他协程共享全局变量和其他大部分东西 不同之处:一个多线程程序可以同时运行 ...

  4. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  5. x86架构:保护模式下利用中断实现抢占式多任务运行

         站在用户角度考虑,一个合格的操作系统即使在单核下也能 "同时" 执行多个任务,这就要求CPU以非常快的频率在不同任务之间切换,让普通人根本感觉不到任务的切换.windwo ...

  6. [lua]再版jobSchedule与脚本描述范型

    首先贴上代码 -- CPM:关键路径法(Critical Path Method) jobSchedule = { todos = { -- todo list ... ["finale&q ...

  7. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  8. 转:Windows消息机制要点

    Windows消息机制要点 1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...

  9. DUI-Windows消息机制要点(34篇)

    [隐藏] 1窗口过程概念 2消息类型 2.1系统定义消息 2.1.1窗口消息 2.1.2命令消息 2.1.3控件通知消息 2.1.4程序定义消息 3消息队列 3.1系统消息队列 3.2线程消息队列 4 ...

随机推荐

  1. 关于缓存的tips——HTTP权威指南读书心得(十三)

    上一章介绍了缓存新鲜度判断的基本原理,本章对于缓存新鲜度判断方法进行一些补充(更新间隔略长略长..). 关于缓存的TIPS 服务器可以通过http定义的几种header对可以缓存数据的存在时间进行控制 ...

  2. Python串口操作纸币器1

    公司需要纸币器开发,参考纸币器文档和网上的一篇vb版本,代码如下: # -*- coding:utf-8 -*- # Author: Pete Yim<xpHook@gmail.com> ...

  3. Oracle 11gR2 create init script

    设置oracle用户变量. [oracle@db01 ~]$ vi /etc/oratab # end line: change db01:/oracle/app/product/11.2.0/db_ ...

  4. Java Web学习笔记-Servlet不是线程安全的

    由于Servlet只会有一个实例,多个用户同时请求同一个Servlet时,Tomcat会派生出多条线程执行Servlet的代码,因此Servlet有线程不安全的隐患.如果设计不当,系统就会出现问题. ...

  5. JSBinding+Bridge:逻辑代码中操作二进制数据

    以这2个函数为例 class File { public static byte[] ReadAllBytes(string path); public static void WriteAllByt ...

  6. Clojure学习资料

    以下大部分收藏自博客:http://blog.csdn.net/ithomer/article/details/17225813 官方文档: http://clojure.org/documentat ...

  7. find job

    处于找工作的状态... 优秀求职者的5个问题: 1.在刚进来2-3个月里,你希望我可以完成哪些工作? 2.公司的优秀员工共同特征是什么? 3.业余时间,公司的员工一般在干什么?

  8. PYTHON queue

    http://blog.csdn.net/bravezhe/article/details/8588437

  9. Qt 国际化之二:多国语界面动态切换的实现

    第一步在你的pro里面加入 TRANSLATIONS = myexec_zh.ts (根据对应的ts文件修改)第二步用lupdate 操作pro 将要翻译的提取到ts文件 命令是 lupdate my ...

  10. Graphql graffiti

    https://github.com/RisingStack/graffiti-mongoose https://blog.risingstack.com/graffiti-mongoose-mong ...