处理一个大文本数据,读取到内存,用多线程并发执行,存入数据库。经多次调试,在程序运行一段时间后间歇性报错——
connectex: Only one usage of each socket address (protocol/network address/port) is normally permitt
并发量也从10000逐步减少到80,chan的容量也从10000000减少到300,同时打开任务管理器,观察,当协程开到10000或者80,并没有多大的区别,使用率都是100%。这是个人电脑,i7-8。所以对于这样的配置,并发开的很大也没有太多的意义,CPU的处理速度是相对稳定的区间,已经使用100%了,开10000个相互等待,和80个相互等待没什么区别,反而我测试,并发开10000时,每秒存入数据库数据的条数保持在2000左右,而开80,每秒可达9000多!效率4倍!同时对内存进行检测,原来内存开的很大,内存使用率也100%,这时候就会报错了!CPU使用率100%是不会出问题的,我连续跑了2个多小时满载都没问题,内存不行,这个是要控制的,我开始测试写入内存的速度,从休眠0.1秒、0.01秒,1纳秒,0.001纳秒……到最后0.1纳秒。这其实就像一个水池,开启一个协程不停的读取大数据文本,把整理的数据流向水池,然后开辟N协程抽取水池里面被整理的数据,当这N多协程的抽水速度低于防水速度时!这时候就会报Only one usage of