如果源请求是通过 pollin 获取的,然后把请求丢到一个线程池去处理,在每个线程内部处理超时,这个是比较容易实现的
现在的场景是,源请求是通过 pollin 获取的,服务器同时还维护一个 socket 池,因此总共需要 poll N + 1 个 socket ;对于每一个源请求,需要检查这个 socket 池中的对应项有没有 pollin 事件:
- 如果有 pollin 事件,则立即返回收到的 byte arrey
- 如果没有 pollin 事件,则一直等到主循环检测到 socket 池中的对应项有 pollin 事件再返回
在这种模式下,万一有个源请求等了一个小时也没有应答也是有可能的,所以最好设置一个超时
但是 poll 是 I/O 事件驱动的,超时不是一种事件,所以感觉要实现的话比较别扭,我能想到的一个方法是这样的:
- 对于 socket 池中的每一个 socket ,设置一个时间标记,比如 -1 表示暂时没有请求, 1466133367 表示有请求,并且如果在这个时间后还没 pollin 事件就超时,返回一个空结果;这种情况下,主循环每跑一次就需要扫描一遍这个时间标记列表 (所以 revents 检测加上 timeout 检测总共需要扫两遍)
还想到一个方法是这样的:
- 另外建立一个线程,专门记录每个请求的超时时间是多少,一旦发生超时就向主循环发送一个消息告诉它某个请求已经超时了,应该返回个空结果
感觉这两种方法都不是特别理想,请问这类问题通常的解法是什么?