V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Antigen
V2EX  ›  Python

请推荐一门能精确控制大量并发并行的编程语言或解决方案

  •  
  •   Antigen · 2020-12-14 17:11:55 +08:00 · 6186 次点击
    这是一个创建于 568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是短时间内发送大量 GET 和 POST 请求,支持并行,要有极致的效率,慢一毫秒都无法接受的那种。

    我现在已经用 Python 的异步方式实现了一个小 Demo,用到了 Trio 和 HTTPX 这两个包。但是速度并不满意。虽然能够并发,但是随着并行数量越来越多,提升硬件和带宽并不能提升效率。毕竟异步仍然是单核单线程。

    我也搜了相关的内容,比如用 Go 语言试试。但是时间有限,比较着急,希望熟悉的大佬能指点一下,谢谢。

    第 1 条附言  ·  2020-12-14 18:02:51 +08:00
    就像 DDOS 那样,只管发,不管目标服务器的反馈。只是尽最大可能保证极致速度。
    66 条回复    2020-12-16 14:09:12 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2020-12-14 17:12:44 +08:00
    java 的 netty
    lscexpress
        2
    lscexpress  
       2020-12-14 17:14:30 +08:00   ❤️ 1
    时间有限那就要看你们团队最擅长的语言是什么了,当然 go 确实满足你的需求
    learningman
        3
    learningman  
       2020-12-14 17:21:12 +08:00
    快那就 C 啊,libcurl,不过这个线程不安全
    maocat
        4
    maocat  
       2020-12-14 17:22:56 +08:00
    golang 纯天然的并发啊
    WalkingEraser
        5
    WalkingEraser  
       2020-12-14 17:40:09 +08:00 via Android
    Erlang OTP,一门为并发而生的软实时语言
    acmore
        6
    acmore  
       2020-12-14 17:42:15 +08:00   ❤️ 1
    Elixir / Erlang
    Actor 模型做这种相对独立的并行任务比 CSP 模型更舒服些。
    misaka19000
        7
    misaka19000  
       2020-12-14 17:43:42 +08:00
    任何语言都实现不了「慢一毫秒都无法接受」,包括市面上主流的操作系统也实现不了你这个需求
    misaka19000
        8
    misaka19000  
       2020-12-14 17:45:16 +08:00
    go 肯定不行,go 还有 gc 呢,对比你这个需求简直是太慢了

    C 或者 C++可能也不行,因为操作系统可能会对进程进行 schedule 导致处理时间变慢

    综上,你只能使用实时操作系统,并且配合 C 语言
    shoaly
        9
    shoaly  
       2020-12-14 17:45:26 +08:00
    这种场景, 瓶颈通常在 网络那边, 不在本机吧..
    FutherAll
        10
    FutherAll  
       2020-12-14 17:50:27 +08:00
    啥应用场景,火箭发射吗?
    renmu123
        11
    renmu123  
       2020-12-14 17:54:05 +08:00 via Android
    发送请求是网络密集型,用不了多少 cpu 。可以多开几个进程搭配异步。go 应该是目前携程用起来最爽的语言了,性能肯定达不到你说的慢 1ms,手写机器语言应该可以达到速度最优但是达不到快速。
    dbskcnc
        12
    dbskcnc  
       2020-12-14 17:54:27 +08:00   ❤️ 6
    慢一毫秒都无法接受的那种,只有 rtos+硬件中继能满足你了
    GM
        13
    GM  
       2020-12-14 17:55:18 +08:00
    一脸问号:既然追求极致效率,还用 HTTP ?果断 Socket 走起啊。
    wuwukai007
        14
    wuwukai007  
       2020-12-14 17:56:18 +08:00 via Android
    随着并发数量增多,效率降低,开多进程作负载应该可以提升不少吧
    YouLMAO
        15
    YouLMAO  
       2020-12-14 17:58:11 +08:00
    量化交易, JP Morgan 开源的嵌入式编程, 使用微波通信, 比光纤快
    nightwitch
        16
    nightwitch  
       2020-12-14 17:58:38 +08:00   ❤️ 1
    "慢一毫秒都无法接受"
    操作系统的调度是有随机性的,网络的拥堵程度也是不可控的。

    另外,速度和吞吐量是两个矛盾的指标。你的标题要“大量并发”,你的正文要“极致速度”,这两个指标是不可能同时满足的
    Antigen
        17
    Antigen  
    OP
       2020-12-14 18:02:15 +08:00
    可能我描述的不太准确。就像 DDOS 那样,只管发,不管目标服务器的反馈。只是尽最大可能保证极致速度。
    hdbzsgm
        18
    hdbzsgm  
       2020-12-14 18:02:53 +08:00
    c++
    cyrbuzz
        19
    cyrbuzz  
       2020-12-14 18:06:53 +08:00
    你用 Python 实现的 demo 瓶颈在于 Python 只能是单核单线程的情况下直接多跑几个不就可以了吗= =...
    Antigen
        20
    Antigen  
    OP
       2020-12-14 18:09:24 +08:00
    @WalkingEraser 我也搜到了 Erlang,但是这门语言的文档和资料少之又少,倒是看国外的社区有很多人推荐。如果用 GO 也可以的话,想用 GO 试试。
    Antigen
        21
    Antigen  
    OP
       2020-12-14 18:10:39 +08:00
    @GM 呃...目标服务器不可控,这不是正向开发。
    Antigen
        22
    Antigen  
    OP
       2020-12-14 18:11:54 +08:00
    @cyrbuzz 我只是描述了最核心的需求,其实还有很多业务上的逻辑要实现,Python 进程间通信又很麻烦。
    mclxly
        23
    mclxly  
       2020-12-14 18:12:14 +08:00
    ![ttt.jpg]( https://i.loli.net/2020/12/14/BkFsApmVu6qJEtb.jpg)

    抓 500 页面的数据,你看看速度满足你的要求么?
    zachlhb
        24
    zachlhb  
       2020-12-14 18:30:29 +08:00 via Android
    tornado
    tempdban
        25
    tempdban  
       2020-12-14 18:35:11 +08:00 via Android
    你要找的是测试仪? t-rex
    march1993
        26
    march1993  
       2020-12-14 18:51:27 +08:00
    要求这么高,就不要用 http 了吧,自己写 socket 调优?
    MeteorCat
        27
    MeteorCat  
       2020-12-14 18:53:02 +08:00 via Android
    估计得上实时系统
    opengps
        28
    opengps  
       2020-12-14 19:05:56 +08:00
    不要纠结单线程多线程,你还可以考虑下多进程。
    我之前开发 gps 压测 tcp 连接的时候,用了一个非常简易的小客户端,然后一个 1080 的屏幕摆满了满满一屏幕小窗口,以至于单个系统发起的连接都已经达到了 65535 的极限,最后开多个电脑内网压测
    ljpCN
        29
    ljpCN  
       2020-12-14 19:13:06 +08:00 via iPhone   ❤️ 1
    慢一毫秒都不行,VxWorks ?
    woctordho
        30
    woctordho  
       2020-12-14 19:14:56 +08:00 via Android
    Erlang,传说中的面向并发编程
    qinfensky
        31
    qinfensky  
       2020-12-14 20:25:27 +08:00 via iPhone
    elixir ?
    kevinwan
        32
    kevinwan  
       2020-12-14 20:37:36 +08:00 via iPhone
    https://github.com/tal-tech/go-zero
    可以试试,我们百万级 qps 平均延迟一般 30 毫秒内
    wjxforu
        33
    wjxforu  
       2020-12-14 20:44:44 +08:00
    erlang 可以考虑一下. erlang vm 对于软实时这方面的优化非常好了. erlang 线程甚至可以支持几十万的线程的并发了.
    书籍的话.
    入门: Erlang 趣学指南 https://book.douban.com/subject/26868859/
    进阶: 高伸缩性系统 https://book.douban.com/subject/30262041/

    熟悉了 gen_server 之后, 可以快速的开发 server 服务了. OTP 框架已经处理了非常多的考虑了.
    zvl0reqglvd
        34
    zvl0reqglvd  
       2020-12-14 21:26:57 +08:00
    硬实时操作系统+C 估计可以,是火箭导弹发射呢?还是月球车遥控呢?
    wellsc
        35
    wellsc  
       2020-12-14 21:36:34 +08:00 via iPhone
    @kevinwan 百万级 qps 得是多大厂啊?你把 qps 和日活搞错了吧
    janxin
        36
    janxin  
       2020-12-14 22:38:24 +08:00
    直接上 RTOS 杜绝多余操作系统开销
    SaltCat
        37
    SaltCat  
       2020-12-14 22:44:38 +08:00
    > 一毫秒都无法接受

    rust + tokio 吧.
    sampeng
        38
    sampeng  
       2020-12-15 00:03:27 +08:00 via iPhone
    毫秒都不行…只有 c 了…当然如果怕写出安全漏洞,那自然是 rust 了。允许毫秒的损失; golang 最合适。
    samuel
        39
    samuel  
       2020-12-15 00:17:00 +08:00
    如果把极致性能作为唯一要求,那应该就是 C 了,然后应该还用得上 DPDK: https://www.dpdk.org/
    echowuhao
        40
    echowuhao  
       2020-12-15 00:43:47 +08:00
    opiviqo
        41
    opiviqo  
       2020-12-15 00:46:30 +08:00
    写裸机程序 不要操作系统 c 语言
    mingl0280
        42
    mingl0280  
       2020-12-15 04:37:44 +08:00 via Android
    C 裸机程序,就这样了……
    philipjf
        43
    philipjf  
       2020-12-15 04:53:29 +08:00 via iPhone   ❤️ 10
    所以昨晚 Google 宕机是楼主在做测试吗?
    dotw2x
        44
    dotw2x  
       2020-12-15 08:07:39 +08:00 via iPhone
    讲真,并发并行考虑下 Erlang,蛮屌的
    xdeng
        45
    xdeng  
       2020-12-15 09:17:21 +08:00
    慢一毫秒都不行?不是局域网的话网络延迟都大于一毫秒了。
    12101111
        46
    12101111  
       2020-12-15 09:29:42 +08:00   ❤️ 1
    FPGA 吧, 量化交易这么干的
    werty
        47
    werty  
       2020-12-15 09:42:53 +08:00
    堆机器?
    这是最简单的方案了吧
    dzmcs
        48
    dzmcs  
       2020-12-15 11:10:24 +08:00
    tcp 不行啊,你得自研新协议,得点对点,不能路由存储转发了,或者只有几级转发

    自研了协议,也不用 rtos 了,网络中断事件里自己调度任务,貌似只有这样才能满足 1ms 都不延误
    q149072205
        49
    q149072205  
       2020-12-15 11:14:44 +08:00
    大并发和语言有毛关系,是整个系统的架构问题,可以做负载转发啊。。
    jtnwm
        50
    jtnwm  
       2020-12-15 11:22:10 +08:00 via Android
    FPGA +1
    jtnwm
        51
    jtnwm  
       2020-12-15 11:26:52 +08:00 via Android
    FPGA 应该可以满足这样极致的效率,不过成本应该挺高的😂
    Antigen
        52
    Antigen  
    OP
       2020-12-15 12:36:42 +08:00
    @philipjf 但是我没 D Google,D 的墙内某节点。

    首先感谢这么多大佬回答。怪我没有描述清楚。

    其实我的核心需求和 DDOS 差不多,只不过还有大量业务逻辑,比如接收到目标服务器关键反馈做出处理。
    yolee599
        53
    yolee599  
       2020-12-15 12:39:29 +08:00 via Android
    不是这么设计的啊,网络延时都不稳定
    ivan_wl
        54
    ivan_wl  
       2020-12-15 14:21:53 +08:00
    dpdk +1
    mingsz
        55
    mingsz  
       2020-12-15 14:49:11 +08:00
    c rust
    manzhiyong
        56
    manzhiyong  
       2020-12-15 14:52:47 +08:00
    你这是要 dns 旁路投毒吗
    dartabe
        57
    dartabe  
       2020-12-15 15:20:12 +08:00
    可以用高级语言设计之后转成 FPGA 架构 HLS

    但不是短时间搞得定的 不知道有没有谁提供定制化服务
    dartabe
        58
    dartabe  
       2020-12-15 15:21:23 +08:00
    AWS AZURE 服务器集群的智能网卡都是 FPGA 做的
    zfish
        59
    zfish  
       2020-12-15 15:40:37 +08:00
    必须上 elixir/erlang 了
    Stlin
        60
    Stlin  
       2020-12-15 16:25:54 +08:00
    go go go
    Greatshu
        61
    Greatshu  
       2020-12-15 16:35:02 +08:00
    上 FPGA 吧,这个需求适合用 C/汇编
    jinliming2
        62
    jinliming2  
       2020-12-15 23:42:10 +08:00
    只管发不管收,那我建议直接 socket,建立 TCP 连接之后直接把固定的 HTTP 协议头硬编码作为 byte[] 发出去,不要走 HTTP 那一套。
    建议 C 语言。
    这种小程序,随便网上一搜就能搜到 sockst 编程示例。
    另外起多个进程,有几个 CPU 核心就起几个进程,进程指定 CPU 亲和性,每个进程分配到指定的 CPU 上。
    CRVV
        63
    CRVV  
       2020-12-16 00:30:12 +08:00
    需求不是这么提的,不能用 “尽最大可能” 这几个字。如果要用 “尽最大可能”,那你就需要明确项目预算或者类似的限制。
    尽最大可能提高速度,那当然是直接把 Internet 停了,全给你一个人用,同时把光纤铺满地球,地表满了就打洞过去,如果嫌光在介质里的速度不够快还可以再开发个不用光纤的传输方式,这样才叫尽最大可能。

    另外,所谓速度其实是两件事情,高吞吐量高和低延迟。DDOS 那样应该是高吞吐量但延迟无所谓。但楼主又说“慢一毫秒都无法接受”,这和 DDOS 完全是两码事了。
    jones2000
        64
    jones2000  
       2020-12-16 01:11:11 +08:00
    c++开发, 或者上集群靠机器顶
    jones2000
        65
    jones2000  
       2020-12-16 01:14:36 +08:00
    另外你的写了你的需求, 但是预算没写呀。 预算越多, 并发越快。给多少钱就办多少事。
    nmap
        66
    nmap  
       2020-12-16 14:09:12 +08:00
    是不是昨天 google 宕机就是你干的?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3821 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 09:58 · PVG 17:58 · LAX 02:58 · JFK 05:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.