第十章 典型并发任务
30| 只运行一次
发现创建的对象地址都是一个
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31 | 仅需任意任务完成
上面是开了10个协程,有一个通过函数获取到值,就放入到channel,然后再从channel中获取数据,返回
本次调用是从5号协程执行后返回
再执行一次,发现是从协程2返回
修改代码后再次运行, 如下
代表有很多协程被阻塞,等待着拿数据。所以展示为11, 很多性能损耗
修改如上图,改为使用bufferChannel
有buffer 则不用等待,此时生产者和消费者解耦。不会导致阻塞
修改代码后,发现协程数量还是2;说明其余的协程直接返回,没有阻塞
32| 所有任务完成
利用channel csp实现
循环所有channel,累加结果返回
+++++++++++++++++++++++++++++++++++++++++++++++++++
33 | 对象池
创建对象池,利用channel
修改代码,不release放回对象,只get获取对象,发现执行报错
如果不获取对象就直接释放,那么会报错
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
34 | sync.pool 对象缓存
不安全的共享池,访问就需要锁
先创建池对象
gc发生,则会清除对象
放回3,再取出就获得了3
如果人工调用gc,那就会重新创建私有对象
+++++++++++++++++++++++++++++++++++++++++++++++++
获取不到私有对象后,后续的协程就获取共享池中的对象