完 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个异步任务没人知道执行完成需要多长时间 , 然后我们程序如果重启的话 , 是等待它完成重启还是强制重启 , 等待完成不知道需要等待多长时间 , 强制重启就无法保证任务能够全部完成 。
最终方案为了一定能够在任何异常情况算出分数和生成报告 , 最后使用消息队列做了这件事 , 发送完成答卷的消息 , 接收到完成答卷的消息之后算出分数生成报告 。做完之后虽然保证了可靠性 , 但是觉得自己发消息自己收消息确实也很别扭 。不知道其他童鞋有没有更好的更合理的方案 。

经验总结扩展阅读