lua程序设计之协同程序

    本文的内容主要来自于《lua程序设计》一书,部份内容来自网络windows

    一个具备多个协同程序的程序在任意时刻只能运行一个协同程序,而且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停。网络

一 协同程序基础多线程

    -协同程序的函数放在”coroutine”的table闭包

    -状态status异步

    -suspended初始状态(建立时)ide

    -running函数

    -deadlua

    -normal:当协程A唤醒协程BA就处于normal状态spa

    -coroutine函数线程

    -coroutine.create(function)     参数为函数,返回一个thread类型的值,表示新的协同程序。

    -coroutine.status(co)       参数为协同程序,返回协程的状态。

    -coroutine.resume(co)     参数为协同程序,启动或再次启动一个协程,并将状态由挂起改成运行。

    -coroutine.yield()  让运行中的协程挂起,而以后再回复它的运行。

    注意:resume运行在保护模式下,所以,若是协同程序内部存在错误,Lua并不会抛出错误,而是将错误返回给resume函数。

    协同中的参数传递形势很灵活,必定要注意区分,在启动coroutine的时候,resume的参数是传给主程序的;在唤醒yield的时候,参数是传递给yield的。----这让我想起了闭包

    1resume能够理解为函数调用,而且能够传入参数,激活协同时,参数是传给程序的,唤醒yield时,参数是传递给yield的。——这让我想起了闭包

    2yield就至关因而一个特殊的return语句,只是它只是暂时性的返回(挂起),而且yield能够像return同样带有返回参数,这些参数是传递给resume的。

二 协同程序的应用:管道与过滤器

    这是《lua程序设计》中的例子,其实就是上面(1)和(2),yield至关于return,而resume至关于函数调用。在coroutine.create()里面yield返回数据,在须要用数据的时候resume调用。

三 协同程序的应用:迭代器

    同二。在递归里面yield,复杂的是迭代器函数的建立。

四 非抢先式的多线程

    将全部协程加入一个一个列表,调度程序则循环遍历全部的协程。当协程完成任务的时候,将该协程从列表中删除。直到全部协程都完成。感受这里的多线程与windows的分时复用有几分类似。


    话说,以前在研究异步加载时候,在网上看到,协同程序也能够实现异步加载,到底怎么作到的呢?有没有人告知?

相关文章
相关标签/搜索