推荐学习书目
› 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 · Dec 14, 2020 · 8996 views
    This topic created in 2152 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    另外,所谓速度其实是两件事情,高吞吐量高和低延迟。DDOS 那样应该是高吞吐量但延迟无所谓。但楼主又说“慢一毫秒都无法接受”,这和 DDOS 完全是两码事了。
    jones2000
    jones2000
    Dec 16, 2020
    64
    c++开发, 或者上集群靠机器顶
    jones2000
    jones2000
    Dec 16, 2020
    65
    另外你的写了你的需求, 但是预算没写呀。 预算越多, 并发越快。给多少钱就办多少事。
    nmap
    nmap
    Dec 16, 2020
    66
    是不是昨天 google 宕机就是你干的?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3184 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 176ms · UTC 04:29 · PVG 12:29 · LAX 20:29 · JFK 23:29
    ♥ Do have faith in what you're doing.