Disruptor 了解一下,单线程却拥有多线程无可比拟的性能 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
javaCoder
V2EX    程序员

Disruptor 了解一下,单线程却拥有多线程无可比拟的性能

  •  
  •   javaCoder 2018-08-16 08:32:04 +08:00 6704 次点击
    这是一个创建于 2661 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Disruptor 了解一下,单线程却拥有多线程无可比拟的性能,原文请戳------> http://www.hchstudio.cn/article/2018/51ba/

    33 条回复    2025-06-25 19:09:33 +08:00
    Finest
        1
    Finest  
       2018-08-16 09:23:33 +08:00
    用过,在特定场景性能挺好的
    linyinma
        2
    linyinma  
       2018-08-16 09:26:23 +08:00
    很显然,单核情况下,单任务性能是最高的(为什么呢?没有多任务切换带来的损失),多任务是提高 CPU 利用率,如果有任务发送阻塞,操作系统将 CPU 交个其他任务(当然调度不是这么简单,这边只是表达设计多任务的目的),假如应用设计优秀,所有调用都非阻塞,让 CPU 一直工作,显然效率是多线程无可比拟的,这也是为什么类似 NGINX 高效的原因所在;
    javaCoder
        3
    javaCoder  
    OP
       2018-08-16 09:33:34 +08:00
    @hand515 是这样的
    javaCoder
        4
    javaCoder  
    OP
       2018-08-16 09:34:06 +08:00
    @linyinma 本身原理比较简单
    lihongjie0209
        5
    lihongjie0209  
       2018-08-16 09:39:17 +08:00
    @linyinma #2 只有在 CPU bound 的任务中你的说法才成立. IO bound 操作比如爬虫单核多线程是有用的
    iceheart
        6
    iceheart  
       2018-08-16 10:09:32 +08:00 via Android
    单进程单线程 600 万订单每秒?真的假的啊?
    javaCoder
        7
    javaCoder  
    OP
       2018-08-16 10:20:33 +08:00
    @iceheart 官方给的数据,没啥太大的问题
    cnmllll
        8
    cnmllll  
       2018-08-16 10:26:59 +08:00
    you c/c++ 版本么
    pythonee
        9
    pythonee  
       2018-08-16 10:27:40 +08:00
    适合什么场景
    javaCoder
        10
    javaCoder  
    OP
       2018-08-16 10:33:14 +08:00
    @cnmllll 应该有可以去官网了解一下
    Giki
        11
    Giki  
       2018-08-16 10:37:11 +08:00   4
    说一下 Disruptor 几个潜在的坑吧,
    1. event handler 的 wait strategy 要选好,一般用 blocking wait,要不然 cpu 消耗很大
    2. 当 ringbuffer 满了,event handler 速度跟不上,event publish 那边会空转等 ringbuffer 的空间,消耗额外 cpu
    3. 如果用 dependant event handler,他在等他依赖的 event handler 完成时也会空转,空转久了又耗 cpu 了
    javaCoder
        12
    javaCoder  
    OP
       2018-08-16 10:49:29 +08:00
    @Giki 感谢提醒,遇到过其中几个,不太好排查
    coolmenu
        13
    coolmenu  
       2018-08-16 11:02:49 +08:00 via iPhone
    做虚拟币交易平台可用
    wyntalgeer
        14
    wyntalgeer  
       2018-08-16 11:12:01 +08:00
    请标明是 java 的,就不用浪费时间看了
    javaCoder
        15
    javaCoder  
    OP
       2018-08-16 11:17:19 +08:00
    @wyntalgeer Disruptor 是一种编程思想,只不过是恰巧使用 java 实现了,您如果对语言有成见,出门右拐,不欢迎您看
    wyntalgeer
        16
    wyntalgeer  
       2018-08-16 11:24:09 +08:00   1
    @javaCoder 如果您认为 java 仅仅是个语言,那么您玩好。我的回复明确表达了已经出门右拐的意思,您还要硬艾特进我来发表攻击性的语言,干脆丰富一些 block list
    widdy
        17
    widdy  
       2018-08-16 11:36:55 +08:00
    @coolmenu 一些撮合引擎宣称百万每秒都被人批判一番,这个 600w,那不得上天!
    sugarsalt
        18
    sugarsalt  
       2018-08-16 11:37:11 +08:00
    @wyntalgeer #16 哈哈,一触即跳
    aLazarus
        19
    aLazarus  
       2018-08-16 12:27:17 +08:00
    感谢 16 楼,Block 了,提前预防
    jianpanxia
        20
    jianpanxia  
       2018-08-16 12:36:27 +08:00
    Martin Flower 应该几年前就发过文章介绍这货了..
    innoink
        21
    innoink  
       2018-08-16 12:40:40 +08:00 via Android
    这不是 n 年前就已经很成熟的技术了么
    sagaxu
        22
    sagaxu  
       2018-08-16 12:41:52 +08:00 via Android
    6M 笔交易,每笔 200 字节,10G 网卡都跑满了,亩产几十万斤
    lhx2008
        23
    lhx2008  
       2018-08-16 12:49:05 +08:00 via Android
    单线程 6m 次的话,光是打印控制台都来不及?
    neoblackcap
        24
    neoblackcap  
       2018-08-16 13:03:52 +08:00 via iPhone
    @sagaxu 一个技术很多高频交易公司都有用,跑满 10G 网卡没什么,有 bond 嘛,文章没看,不过这个技术在特定场景的确还行。比 csp,actor 那些可能还高效些
    skylancer
        25
    skylancer  
       2018-08-16 14:22:57 +08:00
    @wyntalgeer 搜了下你的帖子,全都是一些垃圾话和垃圾贴,建议你发帖前先表明本帖是垃圾帖这样我就不用浪费那几秒钟时间看你的帖了
    SimbaPeng
        26
    SimbaPeng  
       2018-08-16 14:55:44 +08:00
    @wyntalgeer 浪费了我几秒钟看你的回帖,Block
    javaCoder
        27
    javaCoder  
    OP
       2018-08-16 15:10:34 +08:00
    @lhx2008 在代码里面让线程睡了一会儿
    luozic
        28
    luozic  
       2018-08-16 15:16:11 +08:00
    ringbuffer+系统 cpu 多久缓存架构的理解导致这货这么快。
    Wicked
        29
    Wicked  
       2018-08-16 20:31:48 +08:00 via iPhone
    我写过比较粗糙的 cpp 版本,本质上还是要调好 producer 和 costumer 的平衡,因为是 ringbuffer,一旦满了就会阻塞,性能刷刷往下掉。另外也不是一个泛用的模型,只适用于特定场景。
    javaCoder
        30
    javaCoder  
    OP
       2018-08-16 21:26:38 +08:00
    @Wicked 的确是这样的
    dbpe
        31
    dbpe  
       2018-08-17 09:04:28 +08:00
    #16
    哈哈哈 没有大牛命..却有大牛病...
    aR11H34U0m5bK2ox
        32
    aR11H34U0m5bK2ox  
       2024-07-20 23:35:51 +08:00
    哈哈,#16,24 年来看 18 年的破防现场,不知道 6 年过去,成为大牛没有
    javaCoder
        33
    javaCoder  
    OP
       156 天前
    @loyan666 没有 都快失业了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1080 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:58 PVG 01:58 LAX 09:58 JFK 12:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86