主要分析一下这个类库 , 以后自己写或者使用的时候就能得心应手了,而且这个类库也算是创建goroutine,通过channel通信的经典写法吧1.New方法调用的时候,会创建buffer个ch channel,worker个goroutine.由于ch是空的,worker个goroutine会阻塞住,一直等待有程序往ch里面写入数据2.Do函数一但被调用,会传入异步任务的func,func就会写入到ch里面了,goroutine就可以从ch里面读取到数据,并且执行这个数据里面的func践行了这个原则不要通过共享内存来通信,要通过通信来共享内存
有个需要注意的点 , 就Do函数在执行代码是这样的代码里面可以看到在c.ch 写入数据的时候,如果超过c.ch的长度(测试代码里面是1024)就报错返回了 , 这样就不能保证每个异步任务都能稳定执行了,这样的结果就是,如果程序处理慢或者异步任务数量比较多的话(超过1024),异步任务就无法完成 。当然了,我们也可以修改代码改成等待ch的里面数据被goroutine处理的小于1024了 , 也会执行,这样就变成一个不可控的程序了 , 如果有3000个异步任务没人知道执行完成需要多长时间,然后我们程序如果重启的话,是等待它完成重启还是强制重启,等待完成不知道需要等待多长时间,强制重启就无法保证任务能够全部完成 。
最终方案为了一定能够在任何异常情况算出分数和生成报告,最后使用消息队列做了这件事,发送完成答卷的消息,接收到完成答卷的消息之后算出分数生成报告 。做完之后虽然保证了可靠性 , 但是觉得自己发消息自己收消息确实也很别扭 。不知道其他童鞋有没有更好的更合理的方案 。
【完 golang开发:go并发的建议】
推荐阅读
- 三十七 Java开发学习----SpringBoot多环境配置及配置文件分类
- 🔥支持 Java 19 的轻量级应用开发框架,Solon v1.10.4 发布
- 案例分享-https证书链不完整导致请求失败
- 完美世界人物代码网站 完美世界人物代码
- 驱动开发:内核取ntoskrnl模块基地址
- VScode开发STM32/GD32单片机-MakeFile工程JlinkRTT配置
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
- 雅诗兰黛眼部精华怎么才能用到底下的部分_雅诗兰黛眼精华怎么用完
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
- 为了实现梦想我们该怎么做(为了完成梦想我们该做什么)