Python中的异步编程Twisted

我无法在Twisted中开发逆向代理。它工作,但它似乎过于复杂和复杂。这么多感觉像巫毒…

在网上或书中有异步程序结构的简单,坚实的例子吗?一种最佳实践指南?当我完成我的程序,我想能够仍然看到结构在某种程度上,不是看着一碗意大利面条。

Twisted包含一个large number of examples.一个特别是,“evolution of Finger” tutorial,包含一个详细的解释如何异步程序从一个非常小的内核增长到一个复杂的系统有很多移动部件。另一个可能是你感兴趣的是教程简单地writing servers

记住Twisted或者其他异步网络库(例如asyncoreMINAACE)的关键是,你的代码只有在发生某些事情时才被调用。我听过最经常听起来像“voodoo”的部分是回调的管理:例如,Deferred。如果你习惯于编写直接运行的代码,并且只调用立即返回结果的函数,那么等待某事回调的想法可能会让人困惑。但没有什么神奇,没有“巫术”关于回调。在最底层,反应堆只是坐在周围,等待少数事情发生的一个:

>数据到达连接(它将在协议上调用dataReceived)
>时间已过(它将调用用callLater注册的函数)。
>一个连接已被接受(它将调用在注册了listenXXX或connectXXX函数的工厂上的buildProtocol)。
>连接已被删除(它将调用connectionLost在适当的协议)

每个异步程序通过挂接几个这些事件开始,然后启动反应堆等待它们发生。当然,发生的事件导致更多的事件被挂断或断开连接,所以你的程序在快乐的方式。除此之外,没有什么特别的异步程序结构有趣或特殊;事件处理程序和回调只是对象,你的代码是以通常的方式运行。

这里有一个简单的“事件驱动引擎”,显示这个过程是多么简单。

# Engine
import time
class SimplestReactor(object):
    def __init__(self):
        self.events = []
        self.stopped = False

    def do(self, something):
        self.events.append(something)

    def run(self):
        while not self.stopped:
            time.sleep(0.1)
            if self.events:
                thisTurn = self.events.pop(0)
                thisTurn()

    def stop(self):
        self.stopped = True

reactor = SimplestReactor()

# Application    
def thing1():
    print 'Doing thing 1'
    reactor.do(thing2)
    reactor.do(thing3)

def thing2():
    print 'Doing thing 2'

def thing3():
    print 'Doing thing 3: and stopping'
    reactor.stop()

reactor.do(thing1)
print 'Running'
reactor.run()
print 'Done!'

在像Twisted这样的库的核心,主循环中的函数不是sleep,而是一个类似于select()或poll()的操作系统调用,像一个模块暴露的the Python select module.我说“喜欢”选择,因为这是一个在平台之间变化很大的API,几乎每个GUI工具包都有自己的版本。 Twisted目前为这个主题提供了14个不同变体的抽象界面。这样的API提供的常见的东西是提供一种方式说“这里是一个事件列表,我等待,去睡觉,直到其中一个发生,然后醒来,告诉我,其中一个是。 “。

http://stackoverflow.com/questions/80617/asychronous-programming-in-python-twisted

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Python中的异步编程Twisted