这几天写网络爬虫, 结果服务器长时间阻塞在connect上导致不可容忍的并发问题, 于是着手增加一个异步connect接口.
常规的实现手段为配合select进行检测, 不过其性能对于高并发时会有些问题, 如果想做到结构简单合理采用one peer one thread的处理方式还会引发过多的线程上下文切换导致不必要的性能浪费, 故放弃使用select来实现.
由于服务器网络库采用epoll实现, 故此接口也基于epoll实现. 查阅了一些资料, 总结一下:
1. 设置socket为nonblocking
2. 调用connect
3. 将socket加入epoll监听
4. 检测epollout 或 epollhup, 回调上层处理函数做相应的处理, 如果socket ready(仅检测到epollout) 还需额外通过getsockopt判断sock_error值是否正常
5. 将该fd从epoll中清除
ok, 流程明确后, 就开工吧.
接口需求:
1. 可以设定超时, 方便的控制时间, 精度上定为妙级即可
2. 对于连接成功, 错误, 超时均会回调上层接口进行通知