由于子系统中的任务,需要处理的数据量比较大,为了提高系统工作效率,老大要求使用多线程来执行任务,而我刚好负责流程控制这一块,当时真是被多线程折腾的死去活来,这个系统其实是有原型可以参考的,而且这个原型系统是久经考验,稳定性也很高;所以老大给我的时间并不多,我当时也没意识到难度会如此之大,但原型使用的是单线程,很多模块在单线程下跑得很欢,一到多线程就各种难了。
其实现在想来,使用多线程并行处理数据,真心不算个好的决定。
多线程适合处理的任务性质多为耗时的等待,或轮询判断状态。而此数据管理系统的瓶颈却是cpu运算和硬盘数据传输速度,后来测试结果也显示,多线程对性能的提升并不算太明显。当然这个不是主要原因,如果把系统布在强大的服务器上,性能提升还是有的。
更主要的原因是:数据处理任务太不原子化了(额 不知道原子化的反义词是什么),线程安全程度非常低。详细说明下就是,任务执行的过程中,和太多其他模块有太多的交互了,而且大量使用了全局变量(比如处理任务需要的各种参数、配置、执行方案)和静态变量(数据库操作类的静态实例),一旦跑起多线程,就各种并发冲突。当时我又没有很清晰的意识到这个问题,于是到处加锁,在dal入口加锁,在任务存取数据的地方加锁,在使用DBHelper的静态对象地方加锁,搞得这部分异常复杂,而且加太多锁的后果就是性能进一步的下降,搞得几乎和单线程效率差不多了。
额,说了半天废话&