gnet icon indicating copy to clipboard operation
gnet copied to clipboard

希望实现 SetDeadline, SetReadDeadline, SetWriteDeadline

Open ycyuxin opened this issue 2 years ago • 14 comments

恭喜发布 gnet v2

但 v2 中好像还没有实现 SetDeadline,非常期待这个功能。

不知何时能够实现?

ycyuxin avatar Feb 28 '22 01:02 ycyuxin

是否要以使用时间轮的方式来实现,减少Ticker数量对CPU的压力?

UnderTreeTech avatar Feb 28 '22 02:02 UnderTreeTech

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,如果 socket buffer 没数据则挂起当前 goroutine,所以 gnet.Conn 并不需要这几个 APIs。

panjf2000 avatar Feb 28 '22 13:02 panjf2000

能否问下,v2相比v1有什么改变/增强吗,前几天还在熟悉gnet,今天才发现有v2了

einsitang avatar Feb 28 '22 13:02 einsitang

能否问下,v2相比v1有什么改变/增强吗,前几天还在熟悉gnet,今天才发现有v2了

性能提升,API 更加精简,同时增加更多 API 支持,如果你刚开始要使用 gnet,我建议是直接用 v2。 具体可以看:https://gnet.host/blog/announcing-gnet-v2/

panjf2000 avatar Feb 28 '22 13:02 panjf2000

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,所以 gnet.Conn 并不需要这几个 APIs。

请教一下!一般连接都会使用心跳包来保活,gnet不阻塞的这种模式下,每个连接不开一个线程,能怎么实现超时处理?或者gnet在心跳包这一块有什么api可利用的?

skyw4code avatar Mar 01 '22 02:03 skyw4code

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,所以 gnet.Conn 并不需要这几个 APIs。

请教一下!一般连接都会使用心跳包来保活,gnet不阻塞的这种模式下,每个连接不开一个线程,能怎么实现超时处理?或者gnet在心跳包这一块有什么api可利用的?

用 TCP 的 KeepAlive 机制是否能满足你的需求?

panjf2000 avatar Mar 01 '22 02:03 panjf2000

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,所以 gnet.Conn 并不需要这几个 APIs。

请教一下!一般连接都会使用心跳包来保活,gnet不阻塞的这种模式下,每个连接不开一个线程,能怎么实现超时处理?或者gnet在心跳包这一块有什么api可利用的?

用 TCP 的 KeepAlive 机制是否能满足你的需求?

如果用 TCP 的 KeepAlive 的话,希望能够分别设置 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL,但目前的代码中仅有一个参数,没法精确控制。

能不能实现分别设置 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL?

比如采用下面的方法:

WithTCPKeepAlive(cnt, idle, intvl int)

谢谢

ycyuxin avatar Mar 01 '22 03:03 ycyuxin

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,所以 gnet.Conn 并不需要这几个 APIs。

请教一下!一般连接都会使用心跳包来保活,gnet不阻塞的这种模式下,每个连接不开一个线程,能怎么实现超时处理?或者gnet在心跳包这一块有什么api可利用的?

用 TCP 的 KeepAlive 机制是否能满足你的需求?

如果用 TCP 的 KeepAlive 的话,希望能够分别设置 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL,但目前的代码中仅有一个参数,没法精确控制。

能不能实现分别设置 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL?

比如采用下面的方法:

WithTCPKeepAlive(cnt, idle, intvl int)

谢谢

目前 gnet 的 SetTCPKeepAlive() 是和 go 语言的标准库保持一致的,不过新加一个更加精确的 API 也可以,我后面会加上。

panjf2000 avatar Mar 01 '22 03:03 panjf2000

恭喜发布 gnet v2

但 v2 中好像还没有实现 SetDeadline,非常期待这个功能。

不知何时能够实现?

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,所以 gnet.Conn 并不需要这几个 APIs。

请教一下!一般连接都会使用心跳包来保活,gnet不阻塞的这种模式下,每个连接不开一个线程,能怎么实现超时处理?或者gnet在心跳包这一块有什么api可利用的?

用 TCP 的 KeepAlive 机制是否能满足你的需求?

如果用 TCP 的 KeepAlive 的话,希望能够分别设置 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL,但目前的代码中仅有一个参数,没法精确控制。 能不能实现分别设置 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL? 比如采用下面的方法:

WithTCPKeepAlive(cnt, idle, intvl int)

谢谢

目前 gnet 的 SetTCPKeepAlive() 是和 go 语言的标准库保持一致的,不过新加一个更加精确的 API 也可以,我后面会加上。

V2 只看到SetKeepAlivePeriod 并没有看到SetTCPKeepAlive() ...

skyw4code avatar Mar 01 '22 09:03 skyw4code

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,所以 gnet.Conn 并不需要这几个 APIs。

请教一下!一般连接都会使用心跳包来保活,gnet不阻塞的这种模式下,每个连接不开一个线程,能怎么实现超时处理?或者gnet在心跳包这一块有什么api可利用的?

用 TCP 的 KeepAlive 机制是否能满足你的需求?

可以的话还是想做自己协议的心跳包... 灵活度比较高... 心跳机制,除了keeplive有没有比较好的实现方式?

skyw4code avatar Mar 01 '22 09:03 skyw4code

用 TCP 的 KeepAlive 是无法满足7层的心跳需求的。

4层只是检查链路的可用性 7层是需要在链路稳定性基础上检查是否僵尸,比如慢连接或者僵尸连接攻击,虽然每个fd对应的tcp都是健康的,但是大量的僵尸fd耗尽文件描述符导致服务不可用

lesismal avatar Mar 14 '22 12:03 lesismal

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,如果 socket buffer 没数据则挂起当前 goroutine,所以 gnet.Conn 并不需要这几个 APIs。

您好,我现在需要做一个文件拉取的工作,现在发现没有当服务器上把数据写完了,但是本地会丢失很多文件,问题应该是默认的缓存不够,导致数据覆盖,所以就丢失了。请问这个应该怎么处理?如果read()可以使用,那么我每发送一个文件就可以使用read()去阻塞,当接收到了客户端的消息,再继续往下走,但是现在这个不能使用了

sunzhengbo avatar Jul 29 '22 07:07 sunzhengbo

gnet 是基于事件驱动的,Read()/Peek() 这些 APIs 只在 Ontraffic()/OnOpen() 这几个事件回调里才能调用,这里读取的是已经存入本地 buffer 的数据,所以是非阻塞的,而且一定能读到数据,不像标准库是直接调用系统调用 read() 去 socket fd 尝试读数据,如果 socket buffer 没数据则挂起当前 goroutine,所以 gnet.Conn 并不需要这几个 APIs。

您好,我现在需要做一个文件拉取的工作,现在发现没有当服务器上把数据写完了,但是本地会丢失很多文件,问题应该是默认的缓存不够,导致数据覆盖,所以就丢失了。请问这个应该怎么处理?如果read()可以使用,那么我每发送一个文件就可以使用read()去阻塞,当接收到了客户端的消息,再继续往下走,但是现在这个不能使用了

信息太少,不是很理解你的场景,麻烦说详细点,最好能附上 demo 代码。

panjf2000 avatar Aug 06 '22 12:08 panjf2000

是否要以使用时间轮的方式来实现,减少Ticker数量对CPU的压力?

时间堆更好

lxzan avatar Nov 14 '23 08:11 lxzan