9、多线程实战之技巧篇

  • (分而治之思想)将一批任务分进行分解并指派到个人的过程就是一个分而治之的过程。进一步利用多线程,将一个任务分解为若干个子任务并指派专门的线程来负责执行这些子任务。
  • 要使用分而治之的思想,首先需要将程序算法中只能串行执行和可以并发执行的部分区分开来,然后使用专门的线程去并发执行可以并发的部分。多线程中分而治之的两种方式:基于数据的分割基于任务的分割。前者从数据入手,将程序的输入数据分解为若干个规模较小的数据,并利用若干个工作线程并发处理这些分解后的数据;后者从程序的处理任务(步骤入手)将任务分解为若干子任务,并分配若干子线程并发执行这些子任务。

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

  • 如果原始输入数据规模非常的大,比如从几百万条日志记录中统计出我们所需要的信息,就可以使用数据分割来实现。基本思想是:将原始数据按照一定的规则分解为若干规模较小的子输入数据,并使用工作线程来讲这些子输入进行处理,从而实现对输入数据的并发处理。因此基于数据分割的结果是产生一批子任务,这些子任务由专门的工作线程去执行。
  • 以下载大文件为例,思路就是:先获取待下载资源的大小(通过http 中的head的字段content-length获取),在根据多线程的个数来决定子任务的个数,然后确定每一个子任务负责下载文件的数据段范围,最后分别创建相应的下载子任务并为每一个下载任务创建相应的下载线程。源码参考:后续补

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

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

  • 使用过个线程去共同完成一个任务的执行,就是基于任务的分割。基本思想:将原始任务按照一定的规则分解成若干任务,并使用专门的工作线程去执行这些子任务,从而实现任务的并发执行。
  • 按照原始任务的分解方式划分,基于任务的分解可以分为按照任务的资源消耗属性分割和处理步骤分割两种。
1、按照资源的消耗属性分割
  • 线程执行的任务按照其消耗的主要资源可以划分为CPU密集型和IO密集型任务。相应的执行这些任务的线程称为CPU密集型线程(典型案例加密和解密)和IO密集型线程(典型案例文件读写、网络读写)。一个线程如果同时兼具CPU密集型任务和IO密集型任务,称为混合型任务。
  • 以分布式系统中,需要一个统计工具,用于从指定的接口日志文件中统计出外部系统处理指定请求的相应延时情况。日志格式和处理算法如下:


    日志格式

    处理算法

分析:

  • 如果使用之前说的按数据切分的方法,比如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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,141评论 0 9
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,723评论 0 30
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 822评论 0 3
  • 多线程 1.悲观锁和乐观锁 http://www.importnew.com/21037.html 悲观锁悲观锁,...
    bigfish1129阅读 360评论 0 0
  • 引言 如今,基于人脸的技术和话题可以说是炙手可热,基于大数据和人工智能的人脸识别更是突破了我们的想象力的极限,如果...
    AAAA冯晖阅读 1,074评论 0 7