V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
daBig
V2EX  ›  Go 编程语言

Golang net write

  •  
  •   daBig · 2023-06-01 19:38:19 +08:00 · 1137 次点击
    这是一个创建于 577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    golang 新手,最近准备用 go 实现一个网络通信的框架,看了一下 demo 发现, 服务端启动好端口后, 一般都会启动一个协程负责写,比如如果想给客户端主动发一个消息,通常会先发给这个客户端链接的 channel 里,然后通过负责写的协程把消息读出来在调用 conn 的 write ,很多都是这种生产消费的模式。难道直接找到这个链接调用 write 不行吗, 还是有什么性能问题?

    4 条回复    2023-06-02 10:01:47 +08:00
    lhbc
        1
    lhbc  
       2023-06-01 19:44:38 +08:00 via Android
    为了高并发
    lesismal
        2
    lesismal  
       2023-06-01 19:56:38 +08:00
    标准库的 net.Conn 底层是异步 io ,但提供给应用层的读、写都是阻塞接口。
    1. 对于读:如果不使用一个协程循环读,它目前也没有提供事件回调机制通知用户数据到来,所以用户不知道什么时候可读,所以就循环等待读、读到了就处理。
    2. 对于写:如果涉及广播、或者不允许写阻塞免得业务被卡住,那么也得自己封装异步写的机制

    自己写也可以,但既然对读写还有疑问,估计 OP 要摸索很久才能做完善。
    想省力的话可以直接用我的:
    https://github.com/lesismal/arpc
    https://github.com/lesismal/nbio
    Nazz
        3
    Nazz  
       2023-06-01 20:51:14 +08:00 via Android
    当然可以直接写。串行从网络连接读取数据,并行处理业务逻辑,业务协程里面可以直接写,不会阻塞读。
    lysS
        4
    lysS  
       2023-06-02 10:01:47 +08:00
    你说的那应该是抽象拆分带来的问题,本来就应该直接写的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1365 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:15 · PVG 01:15 · LAX 09:15 · JFK 12:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.