• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > lua.dllLua协程使用困惑求解

lua.dllLua协程使用困惑求解

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了lua 协程,协程,协程票务网,unity 协程,协程票务等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:lua.dll Lua协程使用困惑求解
描述:

最近学习Lua的coroutine章节时,总对其使用场景及其意义不明白,自己也试着写了一些代码,但仍然没搞明白。

下面是我写的一段模拟下载网页的程序,使用协程和不使用协程耗时几乎相同,实在没能理解coroutine的非阻塞特性的价值。

-- 本例模拟耗时处理,如下载资源等,使用coroutine优化

local queue = {}

function insert( url )
    local co = coroutine.create(function ( ... )
        handle(url)
    end)
    table.insert(queue ,co)
end

-- 代表下载网页逻辑,这里使用休眠函数模拟
function handle( url )
    sleep(1)
    print('下载完成:' ,url)
end

-- 模拟休眠函数
function sleep(n)
  if n > 0 then 
    os.execute("ping -n " .. tonumber(n+1) .. " localhost > NUL")
  end
end

function start( ... )
    for _ ,co in ipairs(queue) do
        local status ,res = coroutine.resume(co)
        print(status ,res)
    end
end

insert('/image/1.png')
insert('/image/2.png')
insert('/image/3.png')

start()

-- XXX 测试 coroutine 并不能提升响应时间,如果体现其非阻塞特性?

-- handle('/image/1.png')
-- handle('/image/2.png')
-- handle('/image/3.png')

程序使用休眠代替实际下载逻辑,实际测试下来使用协程和不使用协程耗时并无区别,除了调用过程更加复杂,似乎没感觉到什么区别。当然非阻塞的价值也许并不体现在耗时优化上,但看很多socket库使用coroutine来优化,没太理解这样做的用意,如果说有10个下载任务,单线程上再怎么异步也不能提升性能吧。

有精通这块的,烦请给稍微讲解一下,后面也准备去读一些开源库的源码研究一下。


解决方案1:

用协程优化这种网络操作其实原理类似于一个脑筋急转弯:“用一个锅煎1个鸡蛋要3分钟,请问煎3个鸡蛋要几分钟?”
对于网络库而言,如果网络API用的是阻塞API的话,recv操作会阻塞到有合适的缓冲区内容为止,但是recv操作本身并不是用来准备缓冲区的操作,意思就是如果 recv 操作晚于网卡接收数据,也能正确的从缓存获取数据,因而如果在send操作之后就yield当前的coroutine,然后去做一些其他的事(比如再开几个连接),等一会儿再resume回来进行recv操作就可以提高并发度。
相当于说是从:

-- 同时只能处理1个socket
for _, sock in ipairs(socks) do
    send(sock, ...)
    recv(sock, ...)
end

变成:

for _, sock in ipairs(socks) do
    send(sock, ...)
end
-- 同时处理多个socket
for _, sock in ipairs(socks) do
    recv(sock, ...)
end

当然单是这样的话提高的并发度非常有限,要真正提高并发度到一个实用的水准还是得用IO多路复用。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • lua.dllLua协程使用困惑求解

相关文章

  • 2017-06-05 从单片机编程到操作系统产生
  • 2017-06-05 文章标题人机接口设备(HID)和USB设备问题
  • 2017-06-05 网站访问问题,加了indexphp才能访问到
  • 2017-06-05 为了方便大家NDIS方面交流,建了一个QQ群,希望能方便大家交流~
  • 2017-06-05;"无法拨语音电话!!" target="_blank"> ZTE中兴AD3812模块+联通SIM卡,AT指令"ATD<电话号>;"无法拨语音电话!!
  • 2017-06-05 高手请教:Typedef问题
  • 2017-06-05 [求助]一行代码的含义
  • 2017-06-05 请问哪里有usb转打印机接口的原程序下载
  • 2017-06-05 驱动程序需要在windows启动时自动加载,这在注册表的Services里需要写些什么东西呢?有没有这方面的资料
  • 2017-06-05 飞思卡尔spi接收SPISR寄存器中的SPIF位

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何把Windows下的exe直接放到wince下运行,需要哪些附加文件
    • 求问哪出错了,急!
    • 怎样清除系统的DNS缓存?
    • SQLCE此操作系统不支持指定的区域设置。[LCID=-1],请问是怎么回事啊?
    • 编译报错\vadefsh:19:42:#errorERROR:OnlyWin32targetsupported!
    • usbmassstorage开发
    • 大神们看看,我这个基于树莓派的NFC方案可行吗
    • 请问如何使用调用USB接口输出硬件鼠标键盘信号到另一个电脑上面?
    • 移植网卡(博通),如何验证?
    • 分数不多了,大家帮帮忙!PIC24FJ64GA306利用每次更换下次唤醒时间实现各个时间的闹钟,但是每次到凌晨第二天的时候,唤醒时间会出现6万多秒才能继续唤醒

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有