推荐学习书目
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
chaleaoch
V2EX  ›  Python

twisted 有人在用吗? 我是指直接使用.

  •  
  •   chaleaoch · Dec 27, 2020 · 4199 views
    This topic created in 1984 days ago, the information mentioned may be changed or developed.
    基于 twisted 开发项目. 而不是利用基于 twisted 的其他三方模块开发.譬如 channels.

    从我开始接触 python 开始, 就知道 twisted 了. 但是没见过哪个项目使用. 而且 扫了一眼代码感觉很复杂的样子...

    这项目的意义在哪里?
    还是我视野太下载了.
    17 replies    2020-12-31 14:35:28 +08:00
    ipwx
        1
    ipwx  
       Dec 27, 2020   ❤️ 2
    朋友,你知道 Python 有 GIL 嘛?因为 GIL 所以 Python 的多线程并发基本为屎。

    那个 Python 2.x 的年代,Twisted 是写非线程异步并发仅有的选择(之一)。

    现在这个年代选择就多了。从 gevent monkey patch,到 3.5 以后的 asyncio 标准库。而且从某种意义上讲,async io / twisted 这种总体而言写服务器程序就是比多线程高效,这个哪怕是 Java/C#/Go 这种多线程可用的语言也是一样的。
    ynkkdev
        2
    ynkkdev  
       Dec 27, 2020   ❤️ 1
    scrapy 算是基于 twisted 的明星项目了( scrapy 目前也在支持 asyncio )。这个项目确实已经老了,twisted 一部分核心人员也都去 async io 贡献代码了,目前使用上来说 asyncio 是主流了。再加上 golang 写网络服务也挺不错,twisted 确实有点没落
    acmore
        3
    acmore  
       Dec 27, 2020   ❤️ 1
    之前自己写压测工具时了解过,这项目的意义就在于从操作系统手里抢调度权,减少运行单元切换成本和 CPU 利用率。不过现在 Python 有 asyncio 库以及 async/await 语法糖,做类似的事情已经用不着 twisted 了。
    chaleaoch
        4
    chaleaoch  
    OP
       Dec 27, 2020
    @acmore 大佬问一下, 你知道 twisted 的原理吗?

    难道是基于 select epoll 这些吗?
    acmore
        5
    acmore  
       Dec 27, 2020   ❤️ 2
    @chaleaoch 说一下我自己的理解,欢迎斧正:

    首先 twisted 和 epoll 不一样,它们要解决的不是同一个问题。前者是想要在不切换线程的前提下执行多个任务,主要为了对抗 GIL(<strike>Gay In Love</strike>),后者是用更快的时间来处理更多的文件(网络应用是主要方向之一),即 IO Multiplexing,epoll 模型可以作为 twisted 工作的底层平台优化手段,但是两者无直接关系,twisted 主要还是在应用层做的优化。

    具体来说 twisted 使用了 reactor 模型,可以简单理解为一堆任务放在一个队列中,循环扫描,谁发生了某个事件就把它拿出来调用对应的回调函数,这点和 epoll 做的事很类似(在一堆 fd 里只关注发生了某些事件的 fd ),但它们不是同一个东西。既然卡单线程,那就让单线程循环扫描一堆任务,谁举手就执行谁,反而很多情况下比多线程更高效(免去了状态切换等一系列开销),坏处是如果举手的是个坏小子,卡死了主线程,那其他人都没得玩。

    关于 epoll 并不是为了对抗解释器锁或者之类的限制的,而是为了更高效地处理更多的 sockets (在网络编程中),同样可以看作是让一堆 fd 举手发言,把举手的那几个捞出来单独处理,而不用一个个地问。
    johnsona
        6
    johnsona  
       Dec 28, 2020 via iPhone
    你可以网络用 go 其他部分用其他语言,消息队列解耦
    ruanimal
        7
    ruanimal  
       Dec 28, 2020
    @acmore 底层肯定还是 select 或者 epoll
    SlipStupig
        8
    SlipStupig  
       Dec 28, 2020
    大家都在说历史问题,我来说 twisted 一个优势,就是几乎实现了目前市面上的主流协议,而且性能都还比原生 python 要强,如果要搞一些游戏开发,在人手不是很多的情况下 twisted 确实有一定的好处( twisted 初衷就是为了开发游戏)
    SlipStupig
        9
    SlipStupig  
       Dec 28, 2020   ❤️ 1
    @acmore reactor 只是一种 I/O 模型,底层依然是 epoll 和 select,twisted 自身还提供选项
    roundgis
        10
    roundgis  
       Dec 28, 2020 via Android
    一直在用
    chaleaoch
        11
    chaleaoch  
    OP
       Dec 28, 2020
    @SlipStupig 大佬多讲两句.
    chaleaoch
        12
    chaleaoch  
    OP
       Dec 28, 2020
    @SlipStupig 如果 epoll 对象的回调需要 2 秒钟. 那岂不是这个服务器 2 秒钟之内都没响应. 这并发量能上去吗?
    acmore
        13
    acmore  
       Dec 28, 2020   ❤️ 1
    @ruanimal
    @SlipStupig
    没错,底层是,而且相当多的主流框架底层都是,但它们并不能说是一回事,我想表达的是这个区别。
    chaleaoch
        14
    chaleaoch  
    OP
       Dec 29, 2020
    @acmore 大佬 拍脑袋想 是不是可以这样实现.
    起两个线程, 一个线程做 epoll , 收到返回值就将 handle 方队列里.
    另一个线程 就遍历这个队列. 如何条件的就去做回调操作.
    acmore
        15
    acmore  
       Dec 29, 2020   ❤️ 1
    @chaleaoch 你可以看下源码实现( https://github.com/twisted/twisted/tree/41af4fb12e075b8c3aa3cdf6085701195d7f6dae/src/twisted/internet ),从这里开始往外看,里边这一堆 *reactor.py 都是对接了不同 Reactor 的具体实现,其实做的事情很朴素。
    chaleaoch
        16
    chaleaoch  
    OP
       Dec 29, 2020
    @acmore 感谢大佬!
    SlipStupig
        17
    SlipStupig  
       Dec 31, 2020
    @chaleaoch epoll 这种解决的是 IO 复用问题,把 socket 注册到 epoll,通过事件去触发,epoll 本身提供了多种事件类型,read/write/wait 等等,还提供了不同的触发方式:ET/LT,无论是 select 还 epoll,其目的本质是解决如果能用用更少的资源去操作更多的 socket fd,并且效率更高
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1036 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 18:40 · PVG 02:40 · LAX 11:40 · JFK 14:40
    ♥ Do have faith in what you're doing.