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

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

  •  
  •   chaleaoch · 2020-12-27 16:12:46 +08:00 · 3548 次点击
    这是一个创建于 1208 天前的主题,其中的信息可能已经有所发展或是发生改变。
    基于 twisted 开发项目. 而不是利用基于 twisted 的其他三方模块开发.譬如 channels.

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

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

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

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

    难道是基于 select epoll 这些吗?
    acmore
        5
    acmore  
       2020-12-27 22:08:27 +08:00   ❤️ 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  
       2020-12-28 02:01:23 +08:00 via iPhone
    你可以网络用 go 其他部分用其他语言,消息队列解耦
    ruanimal
        7
    ruanimal  
       2020-12-28 14:14:05 +08:00
    @acmore 底层肯定还是 select 或者 epoll
    SlipStupig
        8
    SlipStupig  
       2020-12-28 16:01:14 +08:00
    大家都在说历史问题,我来说 twisted 一个优势,就是几乎实现了目前市面上的主流协议,而且性能都还比原生 python 要强,如果要搞一些游戏开发,在人手不是很多的情况下 twisted 确实有一定的好处( twisted 初衷就是为了开发游戏)
    SlipStupig
        9
    SlipStupig  
       2020-12-28 16:02:47 +08:00   ❤️ 1
    @acmore reactor 只是一种 I/O 模型,底层依然是 epoll 和 select,twisted 自身还提供选项
    roundgis
        10
    roundgis  
       2020-12-28 16:38:21 +08:00 via Android
    一直在用
    chaleaoch
        11
    chaleaoch  
    OP
       2020-12-28 18:50:18 +08:00
    @SlipStupig 大佬多讲两句.
    chaleaoch
        12
    chaleaoch  
    OP
       2020-12-28 18:56:03 +08:00
    @SlipStupig 如果 epoll 对象的回调需要 2 秒钟. 那岂不是这个服务器 2 秒钟之内都没响应. 这并发量能上去吗?
    acmore
        13
    acmore  
       2020-12-28 20:48:06 +08:00   ❤️ 1
    @ruanimal
    @SlipStupig
    没错,底层是,而且相当多的主流框架底层都是,但它们并不能说是一回事,我想表达的是这个区别。
    chaleaoch
        14
    chaleaoch  
    OP
       2020-12-29 11:04:52 +08:00
    @acmore 大佬 拍脑袋想 是不是可以这样实现.
    起两个线程, 一个线程做 epoll , 收到返回值就将 handle 方队列里.
    另一个线程 就遍历这个队列. 如何条件的就去做回调操作.
    acmore
        15
    acmore  
       2020-12-29 17:39:59 +08:00   ❤️ 1
    @chaleaoch 你可以看下源码实现( https://github.com/twisted/twisted/tree/41af4fb12e075b8c3aa3cdf6085701195d7f6dae/src/twisted/internet ),从这里开始往外看,里边这一堆 *reactor.py 都是对接了不同 Reactor 的具体实现,其实做的事情很朴素。
    chaleaoch
        16
    chaleaoch  
    OP
       2020-12-29 18:51:51 +08:00
    @acmore 感谢大佬!
    SlipStupig
        17
    SlipStupig  
       2020-12-31 14:35:28 +08:00
    @chaleaoch epoll 这种解决的是 IO 复用问题,把 socket 注册到 epoll,通过事件去触发,epoll 本身提供了多种事件类型,read/write/wait 等等,还提供了不同的触发方式:ET/LT,无论是 select 还 epoll,其目的本质是解决如果能用用更少的资源去操作更多的 socket fd,并且效率更高
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   942 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 195ms · UTC 20:54 · PVG 04:54 · LAX 13:54 · JFK 16:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.