Twisted 的历史

2012-09-22 05:33:29 +08:00
 Livid
http://www.aosabook.org/en/twisted.html

2000 的时候一位叫做 Glyph 的程序员在用 Java 做一个叫做 Twisted Reality 的 MUD 游戏,之前的 3 threads 实现太过于痛苦,然后他发现 Python 的 select 异步 IO 给力,于是就转用 Python 开发。然后世界上诞生了一个叫做 Twisted 的网络编程框架。
10197 次点击
所在节点    Python
42 条回复
zhangxiao
2012-09-22 09:57:45 +08:00
所以说异步编程和多线程其实是同一层面的概念对吗?是不同的实现“并行”的方式?
guotie
2012-09-22 10:19:39 +08:00
不是。
zhangxiao
2012-09-22 10:24:00 +08:00
@guotie 那异步应该算是什么层面的技术呢?我一直是拿他和多线程做比较的...
heytong
2012-09-22 10:31:57 +08:00
@zhangxiao 两黑火拼,A黑拉上10淫一起上,这叫多线程;B黑被虐,事后拉帮几淫,路口围殴A黑,这是异步.
darklowly
2012-09-22 11:13:11 +08:00
@zhangxiao

多线程和异步两个不同的概念噢

异步一般情况下,都是指IO部分。在执行IO的时候不用等待了。包括定时器,包括键盘鼠标事件,都可以认为是IO。
IO的时候不等待了, 所以在该线程就不会阻塞了。本质上也只能提高IO部分的CPU吞吐率。

多线程 就是拿多个CPU来跑,所以提高吞吐率是必然的。(前提是你有多个CPU)
sivacohan
2012-09-22 11:53:13 +08:00
@darklowly 你对多线程的解释貌似不太对吧。线程可以视为轻量级的进程,创建线程的开销比创建进程的开销要小。进程的数量和CPU数量没关系,线程也没关系啊。linux下创建进程可以fork,线程我不知道……
guotie
2012-09-22 13:53:03 +08:00
我感觉,异步这个概念的范围很广,很模糊,很多情况都可以成为异步;线程就是操作系统中的相对于进程的概念,很明确。

另外,异步、同步应该是从结果上来区分,线程、进程是从手段上区分。
darklowly
2012-09-22 19:23:18 +08:00
@sivacohan 我想是你没明白我的意思,或者是你对线程的理解有问题。

操作系统管理进程和线程的基本思想是分时

在单核上面 多进程和多线程还是在一个CPU上跑。所以这个时候你创建多进程或者是多线程,可以让很多工作同时做了,但是 本质上不能提高CPU的吞吐率。

在多核上跑,多线程和多进程就能同时跑。但是当你同时运行的进程或线程数量超过你CPU的个数的时候,就和单核类似了。

从进程和进程之间的关系来讲 分时的主要目的是可以同时运行多个程序。现在觉得没什么了。很多年前是很先进的。

对于一个具体的进程内部,线程和线程之间的关系,其实差不多,唯一区别就是他们位于同一个地址空间

还有线程虽然比进程轻量级。但是开销还是蛮大的。所以现在的网络服务器很多都开始通过多线程+异步模式来做。这样一来可以通过多线程提高多核CPU的吞吐率,二来异步模式可以防止线程数量过大时线程本身的开销过大

所以就导致了楼主这样的人分不清 线程和异步。本质上他们是在从不同的角度提高吞吐率。但是又完全是两个完全不一样的技术。
darklowly
2012-09-22 19:32:40 +08:00
修正上面的话。不是楼主 是一楼。。。。。
darklowly
2012-09-22 19:54:06 +08:00
@guotie 异步的概念,很明确的。就是等待输入的地方,才会有异步,包括定时器和底层硬件的输入。
zhangxiao
2012-09-22 23:08:39 +08:00
@darklowly 那么在单核的机器上就不可以跑多线程的程序了?还是说跑是一样跑的,只是效率实际上没有提升,因为其实还是在单核上分时跑的?

换个场景,记得最早写带UI的程序的时候,都是让UI跑在一个单独的thread,程序逻辑跑在另一个thread,因为要等待用户交互,有阻塞。这个地方的多线程貌似和你解释的多线程不是一个东西吧?
harmy
2012-09-23 00:47:57 +08:00
异步和同步可以拿麦当劳和肯德基的排队点餐做比喻。肯德基的排队点餐是同步的,因为一个每个服务员负责点餐、收银、配餐,服务好你之前,你后面的顾客只能等待;麦当劳的排队点餐是异步的,服务员给你点完餐收完银之后就让你在旁边一列等,把你交给配餐员了,你后面的顾客此时就可以点餐了。
darklowly
2012-09-23 07:35:39 +08:00
@zhangxiao 在你的CPU没有爆满之前,多线程或多进程可以让你同时干几个事情。

对于同一个程序。多线程可以把UI线程解脱出来,避免UI线程阻塞

我这里说的是吞吐率,当你的负荷很大的时候,如果线程太多,反而会越来越增加负荷。你平时用电脑的时候CPU负荷很低,不要用表象来看待内部。
raptor
2012-09-24 18:23:13 +08:00
顶楼明明是在说Twisted,底下评论怎么就为了线程和异步twist起来了……
其实我觉得twisted已经有点out了,因为它的异步实现还是太扭曲,用起来太痛苦,反正我是已经改用gevent了,greenlet最高。
多线程和异步这样理解应该比较简单:
多线程本质上是OS划分时间片,把CPU分时提供给各线程使用。
异步(多协程)本质上是有一个调度器,在协程进行IO操作需要等待的时候分时切换CPU。
区别就在于:
线程中你不知道OS会在什么时候切换,所以每个线程必须自己小心处理临界量,以防死锁,而且时间片划分过小,则切换成本过高,所以线程开太多性能反而会下降。
在异步的情况下,只有IO的时候会发生切换,所以实际上除了IO以外的所有操作都相当于是“原子”操作,基本不会死锁。而且因为IO操作没有那么频繁,切换成本较低,在一个进程里开非常多的协程也问题不大。
但也不是说异步就完美。
在多核时代,多线程可以充分利用CPU资源。并且线程的切换是强制的,即使某个线程有问题(比如死循环),也不至于阻塞别的线程。
异步本质上是单线程,要利用多核的话通常只能使用多进程(GO语言据说现在在搞支持多线程的方案,但据说效果不是很好),另外,如果某个协程没有IO操作,那么其它协程就会被阻塞。
总体来说,线程适合计算密集型应用,异步适合IO密集型应用。
darklowly
2012-09-24 20:01:47 +08:00
@raptor 你只理解了一半。
raptor
2012-09-25 13:35:27 +08:00
@darklowly 请教另一半
darklowly
2012-09-25 18:30:03 +08:00
@raptor 你把异步 线程 死锁 还有语言级别的协程 纠结在一起了
raptor
2012-09-25 22:30:27 +08:00
好吧,这么说的确有理。
异步并不是只有协程一种实现方式,Twisted和Tornado都是用回调实现的。
不过协程并不一定是语言级别的,greenlet就是一种非语言级别的协程实现。
ch_linghu
2012-09-26 16:27:00 +08:00
异步和同步是相对的概念,用来描述工作的流程。同步的任务有明确的时序,异步不要求任务有明确的时序。至于同步和异步的具体实现,其实是不一定的。

同步流程也可以用多线程、多进程甚至多设备实现。比较典型的比如传统的网络请求应答,就是一个同步流程,但是是在两台设备上实现的。

同样的,异步也可以用单线程实现。gevent的协程就是典型的单线程异步流程实现方式。

线程是一个单机上的并行模型。因为其并行特性,用来实现异步流程是一个比较自然的想法。但线程由于其不可控性,在处理临界量方面确实会增加复杂性。另外线程的产生和切换代价都比较高,不适合大规模使用。所以才会有基于事件切换的比如回调模型、协程模型等更轻量的方式,但要注意的是,回调和协程这些并不是并行执行的。
raptor
2012-09-26 16:28:46 +08:00
顶楼上意见。哈哈

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

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

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

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

© 2021 V2EX