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

2020-12-27 16:12:46 +08:00
 chaleaoch
基于 twisted 开发项目. 而不是利用基于 twisted 的其他三方模块开发.譬如 channels.

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

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

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

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

难道是基于 select epoll 这些吗?
acmore
2020-12-27 22:08:27 +08:00
@chaleaoch 说一下我自己的理解,欢迎斧正:

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

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

关于 epoll 并不是为了对抗解释器锁或者之类的限制的,而是为了更高效地处理更多的 sockets (在网络编程中),同样可以看作是让一堆 fd 举手发言,把举手的那几个捞出来单独处理,而不用一个个地问。
johnsona
2020-12-28 02:01:23 +08:00
你可以网络用 go 其他部分用其他语言,消息队列解耦
ruanimal
2020-12-28 14:14:05 +08:00
@acmore 底层肯定还是 select 或者 epoll
SlipStupig
2020-12-28 16:01:14 +08:00
大家都在说历史问题,我来说 twisted 一个优势,就是几乎实现了目前市面上的主流协议,而且性能都还比原生 python 要强,如果要搞一些游戏开发,在人手不是很多的情况下 twisted 确实有一定的好处( twisted 初衷就是为了开发游戏)
SlipStupig
2020-12-28 16:02:47 +08:00
@acmore reactor 只是一种 I/O 模型,底层依然是 epoll 和 select,twisted 自身还提供选项
roundgis
2020-12-28 16:38:21 +08:00
一直在用
chaleaoch
2020-12-28 18:50:18 +08:00
@SlipStupig 大佬多讲两句.
chaleaoch
2020-12-28 18:56:03 +08:00
@SlipStupig 如果 epoll 对象的回调需要 2 秒钟. 那岂不是这个服务器 2 秒钟之内都没响应. 这并发量能上去吗?
acmore
2020-12-28 20:48:06 +08:00
@ruanimal
@SlipStupig
没错,底层是,而且相当多的主流框架底层都是,但它们并不能说是一回事,我想表达的是这个区别。
chaleaoch
2020-12-29 11:04:52 +08:00
@acmore 大佬 拍脑袋想 是不是可以这样实现.
起两个线程, 一个线程做 epoll , 收到返回值就将 handle 方队列里.
另一个线程 就遍历这个队列. 如何条件的就去做回调操作.
acmore
2020-12-29 17:39:59 +08:00
@chaleaoch 你可以看下源码实现( https://github.com/twisted/twisted/tree/41af4fb12e075b8c3aa3cdf6085701195d7f6dae/src/twisted/internet ),从这里开始往外看,里边这一堆 *reactor.py 都是对接了不同 Reactor 的具体实现,其实做的事情很朴素。
chaleaoch
2020-12-29 18:51:51 +08:00
@acmore 感谢大佬!
SlipStupig
2020-12-31 14:35:28 +08:00
@chaleaoch epoll 这种解决的是 IO 复用问题,把 socket 注册到 epoll,通过事件去触发,epoll 本身提供了多种事件类型,read/write/wait 等等,还提供了不同的触发方式:ET/LT,无论是 select 还 epoll,其目的本质是解决如果能用用更少的资源去操作更多的 socket fd,并且效率更高

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX