The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
daBig

Golang net write

  •  
  •   daBig · Jun 1, 2023 · 1841 views
    This topic created in 1077 days ago, the information mentioned may be changed or developed.

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

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

    自己写也可以,但既然对读写还有疑问,估计 OP 要摸索很久才能做完善。
    想省力的话可以直接用我的:
    https://github.com/lesismal/arpc
    https://github.com/lesismal/nbio
    Nazz
        3
    Nazz  
       Jun 1, 2023 via Android
    当然可以直接写。串行从网络连接读取数据,并行处理业务逻辑,业务协程里面可以直接写,不会阻塞读。
    lysS
        4
    lysS  
       Jun 2, 2023
    你说的那应该是抽象拆分带来的问题,本来就应该直接写的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5774 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 06:37 · PVG 14:37 · LAX 23:37 · JFK 02:37
    ♥ Do have faith in what you're doing.