Go语言从入门到实战 笔记12

第十章 典型并发任务

30| 只运行一次

发现创建的对象地址都是一个

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

31 | 仅需任意任务完成

上面是开了10个协程,有一个通过函数获取到值,就放入到channel,然后再从channel中获取数据,返回

扫描二维码关注公众号,回复: 11309904 查看本文章

本次调用是从5号协程执行后返回

再执行一次,发现是从协程2返回

修改代码后再次运行, 如下

代表有很多协程被阻塞,等待着拿数据。所以展示为11, 很多性能损耗

修改如上图,改为使用bufferChannel

有buffer 则不用等待,此时生产者和消费者解耦。不会导致阻塞

修改代码后,发现协程数量还是2;说明其余的协程直接返回,没有阻塞

32| 所有任务完成

   利用channel csp实现

   

循环所有channel,累加结果返回

+++++++++++++++++++++++++++++++++++++++++++++++++++

33 | 对象池

创建对象池,利用channel

修改代码,不release放回对象,只get获取对象,发现执行报错

如果不获取对象就直接释放,那么会报错

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

34 | sync.pool 对象缓存

不安全的共享池,访问就需要锁

先创建池对象

gc发生,则会清除对象

放回3,再取出就获得了3

如果人工调用gc,那就会重新创建私有对象

+++++++++++++++++++++++++++++++++++++++++++++++++

获取不到私有对象后,后续的协程就获取共享池中的对象

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/106316848