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 这种多线程可用的语言也是一样的。 |
2
youngce 2020-12-27 16:52:01 +08:00 1
scrapy 算是基于 twisted 的明星项目了( scrapy 目前也在支持 asyncio )。这个项目确实已经老了,twisted 一部分核心人员也都去 async io 贡献代码了,目前使用上来说 asyncio 是主流了。再加上 golang 写网络服务也挺不错,twisted 确实有点没落
|
3
acmore 2020-12-27 21:17:43 +08:00 1
之前自己写压测工具时了解过,这项目的意义就在于从操作系统手里抢调度权,减少运行单元切换成本和 CPU 利用率。不过现在 Python 有 asyncio 库以及 async/await 语法糖,做类似的事情已经用不着 twisted 了。
|
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 举手发言,把举手的那几个捞出来单独处理,而不用一个个地问。 |
6
johnsona 2020-12-28 02:01:23 +08:00 via iPhone
你可以网络用 go 其他部分用其他语言,消息队列解耦
|
8
SlipStupig 2020-12-28 16:01:14 +08:00
大家都在说历史问题,我来说 twisted 一个优势,就是几乎实现了目前市面上的主流协议,而且性能都还比原生 python 要强,如果要搞一些游戏开发,在人手不是很多的情况下 twisted 确实有一定的好处( twisted 初衷就是为了开发游戏)
|
9
SlipStupig 2020-12-28 16:02:47 +08:00 1
@acmore reactor 只是一种 I/O 模型,底层依然是 epoll 和 select,twisted 自身还提供选项
|
10
roundgis 2020-12-28 16:38:21 +08:00 via Android
一直在用
|
11
chaleaoch OP @SlipStupig 大佬多讲两句.
|
12
chaleaoch OP @SlipStupig 如果 epoll 对象的回调需要 2 秒钟. 那岂不是这个服务器 2 秒钟之内都没响应. 这并发量能上去吗?
|
13
acmore 2020-12-28 20:48:06 +08:00 1
|
14
chaleaoch OP |
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 的具体实现,其实做的事情很朴素。
|
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,并且效率更高
|