2012-03-08 83 views
4

我已阅读文档。我玩过一些例子。但是,我仍然无法理解异步的意义何时有用,以及这些奇怪的人在哪里看起来如此疯狂?有人可以向我解释python-twisted像我五岁吗?

如果只是为了避免在等待I/O的时候为什么要简单地在线程中运行?为什么需要延期?

我想我错过了关于计算的一些基本知识,所以这些问题。如果是这样,它是什么?

+1

线程具有开销,并等待一个线程仍花费CPU /内存。另外还有同步问题。 – Dikei 2012-03-08 11:12:49

+2

有一个着名的解释和比较不同的I/O策略称为[C10K](http://www.kegel.com/c10k.html)。 – bereal 2012-03-08 11:14:50

+1

@Dikei为什么在异步情况下避免了这种开销?你仍然需要等待并存储程序数据,不是吗? – Moonwalker 2012-03-08 11:18:01

回答

4

就像你是五...好吧:线程坏,异步好!

现在,严重:线程会产生开销 - 包括解释器的锁定和切换,以及内存消耗和代码复杂性。当你的程序被IO绑定,并且等待其他服务(API,数据库)返回响应时,你基本上正在等待闲置并浪费资源。

异步IO的意义在于减少线程开销,同时保持并发性并简化程序,避免死锁并降低复杂性。

认为例如关于聊天服务器。你在服务器上有成千上万的连接,并且你希望一些人根据它们是哪个房间来接收一些消息。用线程做这件事要比做异步方式复杂得多。

延迟 - 这只是一种简化代码的方法,而不是让每个函数都有一个回调函数,当它正在等待的操作已准备好时返回。

另一个说明 - 如果你想要一个更简单和优雅的异步IO框架,尝试龙卷风,它基本上是一个异步Web服务器,与异步HTTP客户端和替代延期。它写得非常好,可以用作通用异步IO框架。

看到http://tornadoweb.org

+1

龙卷风没有任何替代延期。它在每个呼叫站点都有手动回叫传递。这就是* Deferred *的替代。 – 2012-03-08 16:21:15

+1

不,龙卷风有一个新库,可以让你做到这一点。 http://www.ownadoweb.org/documentation/gen.html – 2012-03-08 22:58:51

+1

哇...这几乎就像http://twistedmatrix.com/documents/current/api/twisted.internet.defer.html#inlineCallbacks,但更糟糕的是。 – 2012-03-09 02:11:45

相关问题