`
eric_weitm
  • 浏览: 243732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lua的并发哲学

lua 
阅读更多

lua的并发哲学
实现并发:1、多线程(本质是共享内存数据、所以要同步多线程) 2、协程(本质是单线程、需要保证不阻塞)

协程的好处:
1、不用线程调度所以可以更充分利用cpu、
2、不处理线程同步减少bug、
3、不会为了效率而故意打断逻辑上一致的代码块(所有有IO的地方后续的代码都要放在回调里),
   虚拟机内部在IO函数上yield和resume,回调对用户是屏蔽的

缺点:一个协程阻塞会堵住所有的协程,所以要特殊处理IO

协程体系下的调度器:简单的顺序调度就可以有很高的吞吐率。

一个示例性框架
threads = {} --可以被调度的协程

function receive(connection)
  connection:settimeout(0) -----使得receive调用不会阻塞
  local s, status,partial = connection:receive(2^10)
  if status == "timeout" then
    coroutine.yield(connection)-------让出协程
  end
  return s or partial, status
end

function download(host, file)
  local c = assert(socket.connect(host,80))
  local count = 0 ---收到的字节数
  c:send("GET" ..file.. "HTTP/1.0\r\n\r\n")
  while true do
    local s,status,partial = receive(c)
    count = count + #(s or partial)
    if status == "closed" then break end ------读取结束就退出
  end
  c:close()
  print(file, count)
end

function get(host, file)
---
  local co = coroutine.create(function()
    download(host,file)
  end)

----
  table.insert(threads, co)
end

function dispatch()
  local i = 1
  while true do
    local status, res = coroutine.resume(threads[i])
    if not res then
      table.remove(threads, i)
    else
      i = i+1
    end
  end
end

客户端使用

get(host,"html40.txt")
get(host,"html40.txt")

dispatch()



全脚本服务器的架构

内核:纯c实现的解释器、提供协程调度、io异步等功能(多个c线程分别处理IO、逻辑运算),并发的c线程中,网络来的消息,放入适当的coroutine内部队列中

主线程:进行tick循环,每一次的tick依次调度各个coroutine,

一个tick的逻辑:
更新每个coroutine的消息队列(从脚本内核的内部队列映射到coroutine自己的消息队列)
依次服务每个消息

开源server端框架:copas
http://keplerproject.github.com/copas/
分享到:
评论

相关推荐

    Programming in Lua Fourth edition

    7. **协程**:Lua的协程提供了一种轻量级的并发机制,它们比线程更高效,可以在单线程环境下实现并发执行。 8. **字符串处理**:Lua的字符串是不可变的,提供了丰富的字符串操作函数,如格式化输出、查找、替换等。...

    Lua Programming Gems 高清书签

    Lua的设计哲学是简洁和灵活性,它拥有小巧的语法和强大的元编程能力。其语法简洁明了,易于学习,但同时提供了丰富的语言特性,如动态类型、垃圾回收、闭包以及元表等,这些使得Lua能够处理复杂的问题并保持代码的...

    Lua经典编程书籍三本

    尤其是元表的使用,它是Lua实现动态类型和元编程的关键,而协程提供的轻量级并发模型,能够有效提升程序的并发处理能力。此外,学习如何将C/C++代码与Lua进行集成,对于系统开发人员来说,是一项十分重要的技能。 ...

    lua5.3中文参考手册

    Lua 的设计哲学是简洁、高效,适合嵌入到其他应用程序中作为配置、脚本或控制语言。尽管本手册可能在某些部分显得理论性强,但它提供了全面而精确的语言规范。对于深入理解 Lua 语言的设计理念和技术细节,可以参考 ...

    LuaForWindows_v5.1.4-46

    7. **线程和协程**:Lua不支持多线程,但提供了轻量级的协程(coroutine),用于实现并发执行。 8. **标准库**:Lua附带了一组标准库,涵盖了文件操作、字符串处理、数学运算等多个领域。 掌握这些知识点,你就能...

    Lua中文教程(pdf版)

    在网络编程中,Lua的高并发能力使其成为服务器端脚本的理想选择。此外,Lua还常用于GUI构建,其丰富的图形库支持和跨平台兼容性使得开发者能够快速创建用户界面。 ### 6. 学习Lua的意义 学习Lua不仅可以提升编程...

    Programming_In_Lua.pdf

    - **Web开发**:尽管Lua不是专门用于Web开发的语言,但通过与Nginx等Web服务器结合,Lua可以用来处理高并发请求,实现动态页面的快速响应。 - **系统管理**:Lua的轻量特性使其在系统管理和自动化任务中也能发挥...

    Lua开发教程及相关文档(中文)

    书中还涵盖了Coroutines,这是Lua中的轻量级并发机制,有助于实现异步编程和协同多任务。 《LuaBind参考手册中文版》是关于Lua与C++交互的重要参考资料。LuaBind是一个库,允许C++开发者将C++类和函数绑定到Lua,使...

    Lua程序设计第二版

    《Lua程序设计第二版》是Lua编程语言...书中的实战案例将帮助你快速掌握编程实践,理解Lua的编程哲学,从而在实际项目中发挥出Lua的强大功能。无论你是初学者还是有经验的程序员,这本书都能为你提供宝贵的指导和启示。

    Lua源码分析

    本文将分析Lua的源码,通过源码的剖析,可以更深入地理解Lua的内部工作机制和设计哲学。以下是对Lua源码分析的一些详细知识点。 Lua源码主要可以分为几个部分:虚拟机运转的核心功能、源文件划分、代码风格、Lua...

    Lua快速入门指南.pdf

    Lua的协程(coroutine)提供了一种轻量级的并发机制,与操作系统级别的线程不同,协程的调度完全由Lua运行时控制,非常适合于执行耗时的操作而不阻塞其他任务。 **2. 元表和元方法** 元表是Lua中的特殊表,用于...

    Programming in Lua[中文版]

    通过《Programming in Lua[中文版]》的学习,你不仅可以掌握Lua的基本用法,还能理解其背后的编程哲学,从而在实际项目中更有效地运用这门强大的脚本语言。这本书对于软件开发者来说,是一份不可或缺的参考资料,...

    CC++程序员的Lua快速入门指南

    由于其设计哲学与C/C++存在较大差异,C/C++程序员在转向Lua时需要注意Lua语言独特的特点和概念。 首先,Lua的数据类型包括数值(number)、字符串(string)、布尔(boolean)、函数(function)、表(table)、userdata、...

    extras

    PHP开发者可以通过集成Lua,利用这种特性来改进他们的并发处理能力。 4. **脚本交互**:Lua和PHP可以通过脚本层面的交互进行数据交换,例如通过文件系统共享数据,或者通过网络接口如HTTP进行通信。 5. **游戏开发...

    (2021-2022年)专题资料完美版基于协程的网络开发框架的设计与实现.ppt

    例如,通过引入服务生解法来解决哲学家就餐问题,可以避免资源竞争导致的死锁,实现更有效的并发控制。 【网络框架的设计原则】 设计高性能网络框架时,需要关注以下几点: 1. 减少数据拷贝:优化内存管理,避免...

    Python-一个基于OpenResty的仿Yii的web框架

    从压缩包子文件的文件名"hylun-lua-resty-yii-c468811"来看,"hylun"可能是项目作者的名字或代号,"lua-resty"表明这个框架与OpenResty的Lua接口密切相关,而"yii"则直接指出了其灵感来源。版本号"468811"可能表示...

    Skynet框架之菜鸟手册

    该手册详细介绍了Skynet的核心概念、设计哲学以及实际应用中的技巧。 1. **Skynet框架概述**: Skynet由C语言编写,它采用微服务架构,强调高并发、低延迟和事件驱动。Skynet的核心是服务节点和服务通信机制,每个...

    GoS

    围棋,源自中国,是一种策略性两人棋类游戏,其规则简单却蕴含深奥的战术和哲学思想。在计算机科学中,围棋被视为人工智能的一大挑战,因为它的搜索空间远远超过了其他棋类游戏。AlphaGo,谷歌DeepMind开发的人工...

    gimlet:受Martini和Sinatra启发,用Moonscript编写的OpenResty微型Web应用程序框架

    标题中的“gimlet”是一个基于Moonscript的微型Web应用程序框架,受到了Martini和Sinatra设计哲学的影响。在本文中,我们将深入探讨这个框架以及它所关联的技术领域。 首先,让我们了解一下“Martini”和“Sinatra...

Global site tag (gtag.js) - Google Analytics