Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

希望实现 SetDeadline, SetReadDeadline, SetWriteDeadline #332

Open
ycyuxin opened this issue Feb 28, 2022 · 14 comments
Open

希望实现 SetDeadline, SetReadDeadline, SetWriteDeadline #332

ycyuxin opened this issue Feb 28, 2022 · 14 comments
Assignees
Labels
enhancement New feature or request pending development Requested PR owner to improve code and waiting for the result proposal Proposal for this repo waiting for response waiting for the response from commenter

Comments

@ycyuxin
Copy link

ycyuxin commented Feb 28, 2022

恭喜发布 gnet v2

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

不知何时能够实现?

@ycyuxin ycyuxin added enhancement New feature or request proposal Proposal for this repo labels Feb 28, 2022
@UnderTreeTech
Copy link

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

@panjf2000
Copy link
Owner

panjf2000 commented Feb 28, 2022

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

@panjf2000 panjf2000 added the waiting for response waiting for the response from commenter label Feb 28, 2022
@einsitang
Copy link

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

@panjf2000
Copy link
Owner

panjf2000 commented Feb 28, 2022

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

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

@skyw4code
Copy link

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

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

@panjf2000
Copy link
Owner

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

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

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

@ycyuxin
Copy link
Author

ycyuxin commented Mar 1, 2022

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)

谢谢

@panjf2000
Copy link
Owner

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 panjf2000 added the pending development Requested PR owner to improve code and waiting for the result label Mar 1, 2022
@skyw4code
Copy link

恭喜发布 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
Copy link

skyw4code commented Mar 1, 2022

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

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

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

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

@lesismal
Copy link

lesismal commented Mar 14, 2022

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

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

@sunzhengbo
Copy link

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

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

@panjf2000
Copy link
Owner

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

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

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

@lxzan
Copy link

lxzan commented Nov 14, 2023

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

时间堆更好

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request pending development Requested PR owner to improve code and waiting for the result proposal Proposal for this repo waiting for response waiting for the response from commenter
Projects
None yet
Development

No branches or pull requests

8 participants