跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • twisted 有人在用吗? 我是指直接使用.
未分類
29 12 月 2020

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

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

資深大佬 : chaleaoch 0

基于 twisted 开发项目. 而不是利用基于 twisted 的其他三方模块开发.譬如 channels.

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

这项目的意义在哪里?
还是我视野太下载了.

大佬有話說 (16)

  • 資深大佬 : ipwx

    朋友,你知道 Python 有 GIL 嘛?因为 GIL 所以 Python 的多线程并发基本为屎。

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

    现在这个年代选择就多了。从 gevent monkey patch,到 3.5 以后的 asyncio 标准库。而且从某种意义上讲,async io / twisted 这种总体而言写服务器程序就是比多线程高效,这个哪怕是 Java/C#/Go 这种多线程可用的语言也是一样的。

  • 資深大佬 : youngce

    scrapy 算是基于 twisted 的明星项目了( scrapy 目前也在支持 asyncio )。这个项目确实已经老了,twisted 一部分核心人员也都去 async io 贡献代码了,目前使用上来说 asyncio 是主流了。再加上 golang 写网络服务也挺不错,twisted 确实有点没落

  • 資深大佬 : acmore

    之前自己写压测工具时了解过,这项目的意义就在于从操作系统手里抢调度权,减少运行单元切换成本和 CPU 利用率。不过现在 Python 有 asyncio 库以及 async/await 语法糖,做类似的事情已经用不着 twisted 了。

  • 主 資深大佬 : chaleaoch

    @acmore 大佬问一下, 你知道 twisted 的原理吗?

    难道是基于 select epoll 这些吗?

  • 資深大佬 : acmore

    @chaleaoch 说一下我自己的理解,欢迎斧正:

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

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

    关于 epoll 并不是为了对抗解释器锁或者之类的限制的,而是为了更高效地处理更多的 sockets (在网络编程中),同样可以看作是让一堆 fd 举手发言,把举手的那几个捞出来单独处理,而不用一个个地问。

  • 資深大佬 : johnsona

    你可以网络用 go 其他部分用其他语言,消息队列解耦

  • 資深大佬 : ruanimal

    @acmore 底层肯定还是 select 或者 epoll

  • 資深大佬 : SlipStupig

    大家都在说历史问题,我来说 twisted 一个优势,就是几乎实现了目前市面上的主流协议,而且性能都还比原生 python 要强,如果要搞一些游戏开发,在人手不是很多的情况下 twisted 确实有一定的好处( twisted 初衷就是为了开发游戏)

  • 資深大佬 : SlipStupig

    @acmore reactor 只是一种 I/O 模型,底层依然是 epoll 和 select,twisted 自身还提供选项

  • 資深大佬 : roundgis

    一直在用

  • 主 資深大佬 : chaleaoch

    @SlipStupig 大佬多讲两句.

  • 主 資深大佬 : chaleaoch

    @SlipStupig 如果 epoll 对象的回调需要 2 秒钟. 那岂不是这个服务器 2 秒钟之内都没响应. 这并发量能上去吗?

  • 資深大佬 : acmore

    @ruanimal
    @SlipStupig
    没错,底层是,而且相当多的主流框架底层都是,但它们并不能说是一回事,我想表达的是这个区别。

  • 主 資深大佬 : chaleaoch

    @acmore 大佬 拍脑袋想 是不是可以这样实现.
    起两个线程, 一个线程做 epoll , 收到返回值就将 handle 方队列里.
    另一个线程 就遍历这个队列. 如何条件的就去做回调操作.

  • 資深大佬 : acmore

    @chaleaoch 你可以看下源码实现( https://github.com/twisted/twisted/tree/41af4fb12e075b8c3aa3cdf6085701195d7f6dae/src/twisted/internet ),从这里开始往外看,里边这一堆 *reactor.py 都是对接了不同 Reactor 的具体实现,其实做的事情很朴素。

  • 主 資深大佬 : chaleaoch

    @acmore 感谢大佬!

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具