« 回调还是消息队列 | 返回首页 | coroutine 的回收利用 »

增强了 skynet 的 socket 库

今天想在 skynet 下访问外部的 http 接口, 所以试了一下前几天新写的非阻塞 socket 库

由于测试的时候用的 URL 被墙了,所以发现了问题:connect 目前是阻塞模式的。连接一个有问题的服务器可能被阻塞很久。所以花了点时间把 connect 接口改成非阻塞的了。

我以前没处理过这种情况,所以也就按书上的写法写写,异步 connect 做起来挺麻烦的。如果有用 skynet 的同学这方面经验丰富,烦请用之前帮忙 review 一下新打的 patch 。

另外,为了处理 http 的需求,给 socket 库增加了新接口 readall ,可以读 socket 上的所有数据(直到对方 close 再返回)。

socket.read 和 socket.readline 也改进了,如果对方关闭了连接,那么最后一次调用除了返回 nil 外,也把最后发送过来的数据返回。这样,readline 就可以处理最后一行没有分割符的情况了。

另外一个小改进是针对上次 两步初始化 lua 服务 的。

我在 lua 服务启动模块中增加了出错通知,这样 launcher 服务就可以拿到启动的出错信息了。

当然,我觉得 Hive 里处理服务启动的方式更漂亮一些。就是独立出一个服务启动协议,把启动参数用消息传进去,目前这样用长字符串传递启动消息的方式非常容易出错。

可惜我们已经在目前的 skynet 上积累了太多代码,想改比较困难了。

Comments

同步connect在一些情况下会成为灾难,血的的教训~~
对于connect的问题,我是比较偷懒的做法,直接弄一个线程管理连接/重连和搬数据,与上层通过消息队列或回调传数据。
@qiaojie skynet 里的服务很轻量, 类似于 erlang 的进程. 承受不了独立进程的额外开销.
我的设计比较简单,把服务做成一个可以接受命令行的程序,启动和关闭过程可以通过一条或者多条命令来完成,另外还可以实现一些额外的命令干别的事情,非常容易扩展。在外面套个守护进程,就可以远程进行管理了。

Post a comment

非这个主题相关的留言请到:留言本