golang 监听端口的时候,有没有办法在代码里面去设置 backlog 等待队列的值

2019-06-25 09:56:10 +08:00
 Buffer2Disk

如题,golang 监听端口的时候,有没有办法在代码里面去设置 backlog 的值呢?

像 python 这种可以在监听端口的时候手动设置 backlog 的值 socket.listen(backlog)

我查了下 go 的源码,在 Linux 的环境下,默认读取的是操作系统的 /proc/sys/net/core/somaxconn 值

除非异常的情况下才会使用 syscall.SOMAXCONN

3682 次点击
所在节点    程序员
12 条回复
janxin
2019-06-25 10:24:26 +08:00
net.ListenConfig 看一下?
Buffer2Disk
2019-06-25 10:41:23 +08:00
@janxin
网上查了下,好像说在这里设置没用啊
https://groups.google.com/forum/#!topic/golang-nuts/OfFAcAEuHuQ

<img src="https://i.loli.net/2019/06/25/5d1189836d35499992.png" alt="1100.png" title="1100.png" />

而且问了 golang 开发者,给的回复也是直接调用 syscall/#Listen 。。。。。
janxin
2019-06-25 11:30:12 +08:00
@Buffer2Disk 我没试过设置 backlog,如果按照帖子里的说法,这样的话那就只能 syscall.Socket
devforma
2019-06-25 12:11:03 +08:00
@janxin 正解
Buffer2Disk
2019-06-25 13:06:20 +08:00
@devforma 请问你有试过可以么?
net.ListenConfig 确实可以设置 syscall.SOMAXCONN,但是你可以看下我上面发的 go 的源码里面,
初始化 socket 的时候,除非异常的情况下才会使用 syscall.SOMAXCONN,否则都是读取系统的参数
devforma
2019-06-25 14:18:41 +08:00
@Buffer2Disk 确实,listenconfig 是在 listen 之前设置的,backlog 是在 listen 的时候设置的,从源码来看确实没法程序自定义
devforma
2019-06-25 14:19:58 +08:00
@devforma 用 syscall 自定义 socket 那一套还不如直接 C 来搞
janxin
2019-06-25 14:42:25 +08:00
要么改源码,只要可以添加一个暴露的方法提前定义一下 listenerBacklogCache 里的值就 OK 了

还是建议提个 issue 吧
iceheart
2019-06-25 20:25:37 +08:00
改掉重新编译一下 golang 呗,编译不过几分钟的事儿
Buffer2Disk
2019-06-26 01:14:08 +08:00
@janxin golang 的官方开发人员好像对这种 feature 并不太感冒啊,类似的 issue 我看 3 年前就有人提过了,你看去年 listenConfig 才被加进去,而且还不是个完整能自定义的玩意儿
janxin
2019-06-26 09:43:20 +08:00
@Buffer2Disk 一般都是需要描述清楚了之后因为现在是可以提 PR 的,提个 PR 就好了,小修改不影响 API 兼容性的比较容易进入 Cherry-Pick
xvrzhao
2019-12-24 16:51:24 +08:00
直接系统调用吧,golang.org/x/sys/unix 包 Listen 函数,syscall 包官方已经废弃了。

参数可以参考: https://linux.die.net/man/2/listen

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577144

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX