9、多线程实战之技巧篇

2019-07-21  本文已影响0人  小manong

一、基于数据分割实现并发化

需要注意的地方:
1、工作者线程数量的合理设置问题
2、工作者线程异常处理问题(重试、快速失败等)
3、原始数据未知问题(可以采用批处理的方式对原始数据进行分解,聚集了一批数据后再分配给工作线程去执行,但是需要考虑指派给线程的负载均衡问题)
4、程序的复杂性增加问题

二、基于任务的分割实现并行化

1、按照资源的消耗属性分割

分析:

  • 如果使用之前说的按数据切分的方法,比如400个日志文件,使用4个线程同时去执行(1)同一个请求的开始和结束可能在不同的日志文件中,因此存在线程安全问题,导致处理复杂度上升(2)可能导致io资源争用而减低io效率(3)可能导致处理器时间的浪费,一个工作线程在等待磁盘返回数据期间是处于waiting状态的。
  • 如果使用单线程可以避免(1)问题和(2)问题,但是同样会出现(3)问题,同时处理过程慢
  • 由于日志文件的读取操作是io密集型的而关于时间的统计是cpu密集型的,因此可以考虑采用两种线程配合去执行。LogReaderThread负责日志文件的读取采集;然后在启动一个线程负责数据统计。

(1)基于任务的分割可能导致程序的复杂度增加
(2)多线程可能导致而外的时间消耗
(3)多线程未必比相应的单线程快
(4)考虑从单线程向多线程进化

2、按处理步骤分割

三、合理设置线程数

线程设置过小的话,可能导致无法充分利用处理器资源;线程也不宜过大,过大的话会增加线程上下文的开销以及其他开销。

1、Amdahl's定律
2、设置线程数
image.png
上一篇 下一篇

猜你喜欢

热点阅读