Hello!
2015-11-06 17:40 GMT+08:00 Jeff Yin:
> 我试图在openresty中使用FFI绑定zookeeper C single-thread客户端。
>
> 在zookeeper官方提供的demo中,大体调度方式如下:
>
> zookeeper_interest(zh, &fd, &interest, &tv);
> ...
> rc = select(fd+1, &rfds, &wfds, &efds, &tv);
> ...
> zookeeper_process(zh, events);
>
> 请问我该如何实现对应的select系统调用?
简单的说,你整合进 openresty 或者 nginx 的客户端库不能自己调用 select, poll, epoll, kqueue
这些系统调用,因为它们会阻塞 nginx 主事件循环。一个进程里面只能有一个事件处理循环,否则它们之间会相互阻塞(毕竟只有一个 OS
线程)。推荐的做法是,
1. 基于 ngx_lua cosocket 用 Lua 重新实现 zookeeper 的线路协议(类似 lua-resty-mysql,
lua-resty-redis 这些库的做法),
2. 等待 ngx_lua 包含 wait fd API [1],这样我们可以通过 FFI 方便地整合现有的支持暴露 fd
和非阻塞通信的第三方 C 库(比如 libpq)。但即使是在这种玩法下,第三方库也绝不能自己去 select 啥的。
Regards,
-agentzh
[1] https://github.com/openresty/lua-nginx-module/pull/450