panjf2000 / gnet

🚀 gnet is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go.
https://gnet.host
Apache License 2.0
9.66k stars 1.04k forks source link

如何用同一个eventloop监听多个端口 #59

Closed zhwaaaaaa closed 3 years ago

zhwaaaaaa commented 4 years ago

我看evio是可以得 evio.Serve(events, "tcp://192.168.0.10:5000", "unix://socket")

panjf2000 commented 4 years ago

gnet 不支持这个功能。

zhwaaaaaa commented 4 years ago

可以增加这个功能吗

panjf2000 commented 4 years ago

我之前就是觉得 evio 的这个功能没什么太大的实用价值才在开发 gnet 的时候移除掉的,你要是想监听不同的端口直接在不同的 goroutines 里调用 gnet.Serve() 不就可以了吗?

zhwaaaaaa commented 4 years ago

有些场景下想使用单个线程,并且监听多个端口。我觉得可以像libuv一样把EventLoop 暴露出来,让使用者选择使用何种线程模型

panjf2000 commented 4 years ago

有些场景下想使用单个线程,并且监听多个端口。

能具体说明一下出于什么考虑要用单线程监听多个端口吗?

我觉得可以像libuv一样把EventLoop 暴露出来,让使用者选择使用何种线程模型

不是很理解,"把EventLoop 暴露出来" 是什么意思?还有线程模型的选择,现在 gnet 的线程模型的切换是通过使用 SO_REUSEPORT 指定的,默认是 multi-reactors,指定 SO_REUSEPORT 的话会切换回 evio 的线程模型。

zhwaaaaaa commented 4 years ago

就是让使用者选择使用哪一个io线程。

q191201771 commented 4 years ago

比如,在单event loop线程中无锁处理多个端口的多个连接的业务逻辑。 因为不同端口可能是不同的协议,而不同协议的连接之间可能存在业务关联。

jinzt commented 4 years ago

比如我想开发一个游戏服务器进程,开启一个tcp端口(接受客户端连接),一个http端口(接收运营web通知,修改玩家金币等等),然后在逻辑是在一个io线程下的(不用加锁),在这个io线程即处理来自客户端的tcp消息,也处理来自http运营的通知消息

panjf2000 commented 3 years ago

最近在清理过期 issues,对于这个问题,我相信 runtime.GOMAXPROCS(1) 可以满足这种无锁处理多个服务的场景,所以就不必把这种复杂性引入框架本身了,既然有了解决方案,就暂时先关掉这个 issue,如果还有问题,随时可以重新打开。