Goroutine safe

io safe

基于goroutine的网络架构模型,存在在不同goroutine间共享conn的情况,那么conn的读写是否是goroutine safe的呢?在深入这个问题之前,我们先从应用意义上来看read操作和write操作的goroutine-safe必要性。

  • 对 于read操作而言,由于TCP是面向字节流,conn.Read无法正确区分数据的业务边界,因此多个goroutine对同一个conn进行read 的意义不大,goroutine读到不完整的业务包反倒是增加了业务处理的难度。

  • 对与Write操作而言,倒是有多个goroutine并发写的情况。

  • 所以需要一个

    • req chan tx
      • 需要发什么入队, 出队时转换为指定格式写入conn
    • res chan rx
      • 一个goroutine一直读conn,读成指定格式 写入rx ,rx 出队时候根据命令分到处理

数据通道和命令通道

共用

  • 一条连接既发命令又发数据

  • go tx chan
      
    go rx chan
    
  • 对于数据要分块

    • 例如文件要拆分成块
    • 根据不同的命令分到不同的处理器里

非共用

命令通道

go tx chan

go rx chan

数据通道

go tx chan

go rx chan
  • 每有一个命令就新建一个连接传输数据
  • 此条连接直接收发