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
youngce
V2EX  ›  Python

Python 网络编程框架 tornado 还是 twisted?

  •  
  •   youngce · 2019-05-22 11:06:35 +08:00 · 5073 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前项目中涉及到一些基于 Python 网络编程的工作,前期迫于项目进度,直接用简单 socket 加多线程把需求实现了。但是出于性能优化以及自我提升的需要,希望用一个高性能的框架来重构一下。 不知道有没有前辈指点一下,应该选择哪个框架。进行学习与开发?

    28 条回复    2019-05-28 18:43:57 +08:00
    NaVient
        1
    NaVient  
       2019-05-22 11:08:51 +08:00
    高性能就换 go
    seeusoon
        2
    seeusoon  
       2019-05-22 11:11:12 +08:00   ❤️ 1
    能换成 go 么?比你说的这两个都好
    非得二选一,那就是 tornado
    youngce
        3
    youngce  
    OP
       2019-05-22 11:11:58 +08:00
    @NaVient go 的网络编程上周末刚刚看着文档写了几个 demo,用到生产还是有点虚。。。
    Philippa
        4
    Philippa  
       2019-05-22 11:18:13 +08:00 via iPhone   ❤️ 1
    两个都很老,二选一推荐 Twisted 比较好,因为很多其他项目也会集成这个框架。但语法比较魔法,还是 async 出来之前的产物,但性能很不错,熟练之后你可以用它来改造你的其他项目。
    crazypig14
        5
    crazypig14  
       2019-05-22 11:28:10 +08:00
    我喜欢 flask
    keakon
        6
    keakon  
       2019-05-22 11:45:18 +08:00   ❤️ 1
    之前我也是 Tornado 的粉丝,不过现在在做的新项目是用 Python 3.7,比较了一番后用了 Starlette。
    如果不是做 web 服务,自己拿 asyncio 实现也没几行代码,还有挺多数据库已经支持 asyncio 了。
    youngce
        7
    youngce  
    OP
       2019-05-22 11:47:16 +08:00
    @crazypig14 flask 属于常规的 WEB 框架了,可能不在这里的讨论范围内?
    BBCCBB
        8
    BBCCBB  
       2019-05-22 11:51:01 +08:00
    49 年入国军..


    建议要么用 asyncio, 要么就 gevent 撑一撑.
    Wincer
        9
    Wincer  
       2019-05-22 11:56:18 +08:00 via Android
    asyncio 里是有 socket 的,不过并不兼容标准库里的 socket,但确实是异步非阻塞。如果你一定想要高性能的话,可以试试别人用 cython 写的框架 vibora。
    Trim21
        10
    Trim21  
       2019-05-22 12:24:51 +08:00
    起码也得是基于 asyncio 的吧,twisted 就算了
    crazypig14
        11
    crazypig14  
       2019-05-22 12:40:19 +08:00
    @youngce 没仔细看不好意思。。场景压力没那么大的话 twisted 写起来舒服点
    lanshee
        12
    lanshee  
       2019-05-22 15:23:52 +08:00
    试试 sanic????
    warcraft1236
        13
    warcraft1236  
       2019-05-22 15:59:34 +08:00
    https://github.com/MagicStack/uvloop 最近看到个这个,不知道怎么样
    chenqh
        14
    chenqh  
       2019-05-22 16:09:32 +08:00
    tornado 在 py3 用的就是 asyncio,你们说什么呢
    misaka19000
        15
    misaka19000  
       2019-05-22 16:22:34 +08:00
    经验之谈,不要用 Python 写网络相关的东西,异步+协程 会被搞死的,我也建议使用 go 来写,或者 Java 也行
    lolizeppelin
        16
    lolizeppelin  
       2019-05-22 16:23:53 +08:00
    openstack 用的 eventlet,什么 tornado、twisted 的都没用

    什么 async 的就算了...除非大量现有库改成 async 的
    否则一旦你用到有没有 async 的支持会很蛋痛

    eventlet 是不好,但确是目前最可行的方式,网络编程想提升的话,建议你把 eventlet 的代码通读搞懂了

    搞懂这个,你会发现所有的协程其实都是一个卵原理
    imkerberos
        17
    imkerberos  
       2019-05-22 16:26:20 +08:00
    虽然 async 比较新, 但是现在我还是推荐你用 twisted, 以后你会感谢我.
    zoowii
        18
    zoowii  
       2019-05-22 16:29:29 +08:00
    用 go
    2805408253
        19
    2805408253  
       2019-05-22 16:30:56 +08:00
    15 年的项目用的就是 twisted,挺稳定的。
    2805408253
        20
    2805408253  
       2019-05-22 16:32:02 +08:00
    现在重构的话,我选择 go。坏笑.jpg
    myyou
        21
    myyou  
       2019-05-22 17:12:18 +08:00
    asyncio 配合 uvloop 可以先用用,性能应该不错
    robot1
        22
    robot1  
       2019-05-22 17:25:26 +08:00
    twisted 比较齐全,各式各样的都帮你封装好了 推荐 twisted
    keysona
        23
    keysona  
       2019-05-22 17:37:09 +08:00   ❤️ 1
    我之前维护个公司的几个 tornado 项目。里面坑比较多,但不是不能用。有点微妙。

    后来学习了下 asyncio,发现这个更复杂。记得 flask 作者还吐槽过。

    之后我换成 go 了。发现这才是我想要的异步。虽然写起来没有 python 那么爽...

    最后我决定,涉及到网络编程的一律用 go。

    现在公司新开的后端 api 项目首选 go,并且逐步迁移 tornado 项目。

    ===

    非得二选一,还是 tornado 吧。
    scalaer
        24
    scalaer  
       2019-05-22 17:54:40 +08:00
    asyncio 基本库
    sujin190
        25
    sujin190  
       2019-05-22 17:55:25 +08:00
    从性能上看 tornado 和 twisted 差不多,好处是 twisted 实现的网络协议很多,没特殊要求我还是支持 tornado,感觉对 async await 支持更方便

    asyncio 性能看似更好一些,但是其实只有 protocol,不过在 async reader 和 writer 的情况下,其实也差不多,不过不得不说 tornado 的 iostream 的实现过于复杂了,极大的拉低了性能

    自己也实现过一个简单的,https://github.com/snower/sevent 差不多有 asyncio 三倍的网络性能,协议解析简单代理转发类的服务还不错

    认真说还是 asyncio 吧,async 配合 await 还是比较容易写的,其实 go 的开发效率感觉还是低一些,没什么几万几十万并发的,性能啥的完全不是问题,感觉没啥特别必要,但是 go 确实方便啊
    thechosenone
        26
    thechosenone  
       2019-05-22 19:31:17 +08:00
    twisted 了解不多但似乎比 tornado 更古老,tornado 前几年发展缓慢一直是因为考虑兼容 py2 和 3 的问题,而主力维护者现在只有一个了,但是 tornado 从 5 之后(大概)只支持 3 了,现在 tornado 的版本更迭是非常快的,而且你在 github 提 issue 开发者回答是很快的,再加上国内公司用 twisted 的更少,作为 python 框架中原生支持异步网络,我认为 tornado 是一个很好的选择,至于又有人说什么 go 的,都是瞎 jb 提,怎么不叫楼主学 c ?不学 rust ?性能不必 go 高?
    playniuniu
        27
    playniuniu  
       2019-05-23 06:38:11 +08:00 via iPhone
    忍痛换 go 吧,后面你会发现比你维护 async 之类的省心太多
    zvall
        28
    zvall  
       2019-05-28 18:43:57 +08:00 via Android
    @chenqh 是你用不好 python 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.