github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/chapter/ch4_并发编程.md (about)

     1  # ch4 并发编程
     2  
     3  ## Thead vs. Groutine
     4  
     5  1. 创建时默认的 stack 的⼤⼩
     6     - JDK5 以后 Java Thread stack 默认为1M
     7     - Groutine 的 Stack 初始化⼤⼩为2K
     8  
     9  
    10  2. 和 KSE (Kernel Space Entity) 的对应关系
    11     - Java Thread 是 1:1
    12     - Groutine 是 M:N
    13  
    14  ![](../img/协程.png)
    15  
    16  ![](../img/协程队列.png)
    17  
    18  计数器:procesor 完成的 协程的数量。。长时间不变,直接中断
    19  
    20  ## 协程
    21  
    22  ```go
    23  func TestGroutine(t *testing.T) {
    24  	for i := 0; i < 10; i++ {
    25  		go func(i int) {
    26  			fmt.Println(i)
    27  		}(i)
    28  	}
    29  	time.Sleep(time.Millisecond * 50)
    30  }
    31  ```
    32  
    33  ## CSP(Communicating sequential processes) 并发机制
    34  
    35  类似于 Java 中的 Future
    36  
    37  [26_async_service_test.go](../src/test/chapter/ch4/26_async_service_test.go)
    38  
    39  ## 多路选择 和 超时控制
    40  
    41  [27_select_test.go](../src/test/chapter/ch4/27_select_test.go)
    42  
    43  ## Channel 的关闭和广播
    44  
    45  [28_select_close_test](../src/test/chapter/ch4/28_select_close_test.go)
    46  
    47  - 向关闭的 channel 发送数据,会导致 panic
    48  - v, ok <-ch; ok 为 bool 值,true 表示正常接受,false 表示通道关闭
    49  - 所有的 channel 接收者都会在 channel 关闭时,⽴刻从阻塞等待中返回且上 述 ok 值为 false。这个⼴播机制常被利⽤,进⾏向多个订阅者同时发送信号。 如:退出信号。
    50  
    51  ## Context 与 任务取消
    52  
    53  [29_cancel_test](../src/test/chapter/ch4/29_cancel_test.go)
    54  
    55  [30_cancel_by_context_test.go](../src/test/chapter/ch4/30_cancel_by_context_test.go)
    56  
    57  Context
    58  
    59  - 根 Context:通过 context.Background () 创建
    60  - ⼦ Context:context.WithCancel(parentContext) 创建
    61    - ctx, cancel := context.WithCancel(context.Background())
    62  - 当前 Context 被取消时,基于他的⼦ context 都会被取消
    63  - 接收取消通知 <- ctx.Done()
    64  
    65  ## 常见并发任务
    66  
    67  ### 仅执行一次
    68  
    69  单例模式(懒汉式、线程安全)
    70  
    71  [31_once_test.go](../src/test/chapter/ch4/31_once_test.go)
    72  
    73  ```go
    74  var singleInstance *Singleton
    75  var once sync.Once
    76  
    77  func GetSingletonObj() *Singleton {
    78  	once.Do(func() {
    79  		fmt.Println("create obj")
    80  		singleInstance = new(Singleton)
    81  	})
    82  	return singleInstance
    83  }
    84  ```
    85  
    86  ### 仅需任意任务完成
    87  
    88  [32_first_response_test](src/test/chapter/ch4/32_first_response_test)
    89  
    90  ### 必须所有任务完成
    91  
    92  [33_util_all_done_test](src/test/chapter/ch4/33_util_all_done_test)
    93  
    94  ## 对象池
    95  
    96  ### 使⽤buffered channel实现对象池
    97  
    98  [34_obj_pool_test.go](src/test/chapter/ch4/34_obj_pool_test.go)
    99  
   100  ### sync.Pool
   101  
   102  - 适合于通过复⽤,降低复杂对象的创建和 GC 代价
   103  - 协程安全,会有锁的开销
   104  - ⽣命周期受 GC 影响,不适合于做连接池等,需⾃⼰管理⽣命周期的资源的池化