Lua中协程的使用

平常访问网络都会使用回调的方式,现在通过协程改变这种回调的模式,让异步方法按同步的方法来使用

-- co.lua
yield   = coroutine.yield
co      = function(func, cb)
    local cor = coroutine.create(func)
    local next = coroutine.resume
    local hasNext; hasNext = function(status, func, ...)
        -- suspended
        if not status then return end
        -- only function
        if type(func) == "function" then
            -- call function
            func(--[[callback]]function(...)
                hasNext(next(cor, ...))
            end)
        elseif cb then
            cb(func, ...)
        end
    end
    hasNext(next(cor))
end
-- test.lua
require("co")

-- 网络异步操作
function request(url)
    return function(next)
        ...

        next("网络返回结果")
    end
end

-- 运行一个协程方法
co(function()
    local result = yield(request("http://login.9173.com"))
    local result_json = json.decode(result)
    if result_json.ok then
        -- other code
    end
end)

这里一共使用了两个函数coyield

co接收一个函数为参数,该函数由coroutine协程去执行

yield接收一个函数为参数,传入的函数会有一个next函数类型的参数,返回值为next函数传入的值,即

local result = yield(function(next)
    next("success") -- 调用next()表示该函数运行结束,如果没有返回值直接next()即可
end)

-- result: success
时间: 2024-10-06 08:15:24

Lua中协程的使用的相关文章

Lua的协程和协程库详解

我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thread.每一个线程都代表一个执行序列. 当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行. 在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定.

lua的协程(coroutine)

协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息.线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过协作来完成,任何时刻只有一个协程程序在运行.并且这个在运行的协程只有明确被要求挂起时才会被挂起 你可以使用coroutine.create来创建协程: co = coroutine.create(function () print("hi") end) 协程有三种状态:挂起,运行,停止

深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的coroutine课程,花了几天时间读完后,为了加深理解就把其中个人认为最为精华的部分摘下来并加上个人理解写了本篇博客. 扯一些淡: 既然要搞一个操作系统,那我们就先来设一个目标吧!就像找女朋友,我们不可能随随便便的是个女的就上,肯定要对女方有一定的要求,比如肤白貌美气质佳…… 所以,我们对这个' 姑娘

python中协程

协程是python中除了进程和线程之外又一种能够实现多任务的方式,又称为微线程,纤程,它相比于线程需要的资源更少. 在python种协程是通过generator实现的.通过yield保存当前运行的状态然后切换到另一个协程执行.普通的生产者-消费这模式是一个线程写消息,一个线程才能读取消息,因此需要控制队列的写入与读取数据.而改用协程可以在生产者生产消息后直接通过yield跳转到消费者开始执行,执行完毕后在切换到生产者,如此反复,效率极高. 在图中,我们可以看出通过next的方法使得生成器中的任务

【Lua】协程的应用

前言 协程可以解决哪些编程问题? 生产者-消费者 生产者A做面条,消费者B吃面条.A做完面条,B吃面条,吃完了,A再做... 则,有两种模式: 在消费者B吃面的function中插入resume唤醒生产者A,A生产完后放置一个yield(面条),返回面条并暂停,B接到返回值(面条)后开始吃. 在生产者A生产的function中插入resume(面条)唤醒消费者B,B吃完后放置一个yield,暂停,A继续做面条. 可见,主循环放在B和A中都可以,一方为主,另一方为服务.

unity3D中协程和线程混合

这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了这样的使用方法: IEnumerator LongCoroutine() { yield return StartCoroutine(DownloadZip()); ExtractZip(); yield return StartCoroutine(LoadZipContent()); } 可是Ex

关于Unity中协程、多线程、www网络类的使用

协程 我们要下载一张图片,加载一个资源,这个时候一定不是一下子就加载好的,或者说我们不一定要等它下载好了才进行其他操作,如果那样的话我就就卡在了下载图片那个地方,傻住了.我们希望我们只要一启动加载的命令,回来的时候主线程能够继续进行下去. 我们可以启动一个协程去下载,主进程依然在运行.有点类似多线程,不同的是,实际上它还是在一个线程里面,所以我们是在主线程中开启一段逻辑来进行处理,来协同当前程序的执行,还是在主线程里面. 1:在主进程中开启另外一段逻辑处理,来协同当前程序的执行,但与多线程不同都

Python中协程的实现

通过关键字yield,可以从生成器中产生值,并返回.我们可以将生成器作为一个生产者来使用. 在协程中,通过使用关键字yield,还可以让具有yield的程序接收值.此时函数作为消费者,消费我们传入(send)的值. 在协程中,可以把yield作为右值来用.在foo函数中,我们这样写: n = yield 可以通过send方法来向foo函数发送值,这时,发送的值被foo接收,并存到n里. n中的值可以在foo函数中使用 这样,yield作为右值来使用,就使得foo函数变成了一个消费者. 我们知道,

lua编程之协程介绍

一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式多任务系统,而协程实现的多任务系统成为协作式多任务系统.线程由于缺乏yield语义,所以运行过程中不可避免需要调度,休眠挂起,上下文切换等系统开销,还需要小心使用同步机制保证多线程正常运行.而协程的运行指令系列是固定的,不需要同步机制,协程之间切换也只涉及到控制权的交换,相比较线程来说是非常轻便的.