Poslua Blog

「你是一个出色的程序员」要比「你是一个开发总监」要有意义的多

Goto in LuaJIT

吊炸天的 LuaJIT

Lua 在 5.2 之后的版本,加入了 goto 这个关键字,用来控制程序跳转到指定 label。我们可以利用这个特性,来模拟 continue 的实现。需要注意的是 goto 只能跳转到 label,而 ::name:: 的格式就可以设置一个 label。 for i=1,5 do if i == 3 then goto continue end ...

OpenResty 中的连接池

连接池常见问题排查

注:set_keepalive 和 close 互斥(一个 socket 对象不能执行多次 setkeepalive 操作,会报:连接已关闭) 连接池的大小是对每一个 nginx worker 而言的。如果有 N 个 worker,最多就会有 N * pool_size 个连接。比如设置 keepalive = 100,开始启动时候是 0 连接来一个请求,获取一个 socket(空...

tail call 到底有啥用?

来体验下 proper tail call 强大的威力

在聊今天这个话题之前,我们需要知道什么叫 tail call。先来看下,lua 程序设计是怎么定义的: 尾调用是一种类似在函数结尾的 goto 调用,当函数最后一个动作是调用另外一个函数时,我们称这种调用尾调用。例如: function f(x)     return g(x) end g 的调用是尾调用。 例子中 f 调用 g 后不会再做任何事情,这种情况下当被调用函数 g ...

利用 loadstring 实现模块动态加载

Lua 中模块的动态加载

先来看一段 snippet: do i = 32 local i = 0 f = loadstring("i = i + 1; print(i)") g = function () i = i + 1; print(i) end f() --> 33 g() --> 1 h = function () _G.i = _...

require 理解

Lua require 模块加载机制

在 lua 中加载的其他文件的代码,通常可以使用 dofile、loadfile、require 函数等来完成。其中 dofile 每次加载都要编译执行,效率比较低,所以不推荐使用;同样 loadfile 虽然只需编译一次,但是并没有把结果缓存到 lua vm 中;因而,我们这里总是推荐使用第三种方式 require。 require 能够避免多次重复加载模块,一个模块被加载后会被缓存到 ...

捋一捋 backlog 的作用

聊不完的 TCP/IP

我们知道在 socket 编程中,服务端需要经历 listen → bind → accept 这么几个过程;而客户端需要经历 connect → receive 的过程。其中服务端在 bind 的时候需要指定 backlog 的大小。网上的好多文章,感觉都没有讲清楚这个参数的作用,特在此好好捋一下。方便他人,同时也方便自己。 术语约定: 未完成:半开,处于 SYN_RCVD 状态...

OpenResty 中的 Atomicity & Lock

OR 中的原子性和锁

先来引用官方的描述: Atomicity is only guaranteed on the method call level. That is, “get” is atomic, “set” is atomic, but the calling sequence of “get” and “set” is not. If you want to lock a sequence o...

cosocket

cosocket 的 connect 是会有创建 sock 的行为的

TCP 协议是面向流的。面向流是指无保护消息边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中会接收两个或者更多的数据包。 在传统的 socket 编程中 socket.socket() 会创建一个套接字(内核对象),本质就是一个 socket 文件句柄(套接字句柄),和普通的文件差不多。只有在调用 connect() 或 bind() 之后才会产生可以网络通讯的套接字(...

Lor 源码解析

lor 是一个基于 ngx_lua 的 MVC 框架,其 API 很类似于 Node 社区的著名框架 Express lor 代码结构如下: lor/ ├── index.lua ├── lib │ ├── application.lua │ ├── debug.lua │ ├── lor.lua │ ├── methods.lua │ ├── middleware ...

OpenResty Coroutine 的调度机制

在聊这个话题之前,我们需要明确的是 Nginx 的多进程单线程的进程模型。OpenResty 正是基于其 master → worker 模型,在 master fork 出 worker 时,将存在于 master 中的 lua vm 通过系统的 cow 机制传递到 worker 中。 注:既然是通过 fork 传递过去的,所以 init_by_lua 里面创建的 Lua 全局变量...