完 golang开发:go并发的建议( 二 )

主要分析一下这个类库 , 以后自己写或者使用的时候就能得心应手了,而且这个类库也算是创建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并发的建议】

推荐阅读