Python中的异步编程

Python中的异步编程,python,asynchronous,twisted,Python,Asynchronous,Twisted,我在Twisted中开发反向代理时遇到问题。这是可行的,但似乎过于复杂和复杂。很多感觉都像是巫毒 在web或书籍中是否有任何简单、可靠的异步程序结构示例?一种最佳实践指南?当我完成我的程序时,我希望能够以某种方式看到结构,而不是看着一碗意大利面。Twisted包含一个。特别是,包含了异步程序如何从一个非常小的内核发展到一个包含许多运动部件的复杂系统的详细解释。另一个你可能感兴趣的是关于simply的教程 关于Twisted,甚至其他异步网络库(例如,或),需要记住的关键一点是,您的代码只有在发生

我在Twisted中开发反向代理时遇到问题。这是可行的,但似乎过于复杂和复杂。很多感觉都像是巫毒

在web或书籍中是否有任何简单、可靠的异步程序结构示例?一种最佳实践指南?当我完成我的程序时,我希望能够以某种方式看到结构,而不是看着一碗意大利面。

Twisted包含一个。特别是,包含了异步程序如何从一个非常小的内核发展到一个包含许多运动部件的复杂系统的详细解释。另一个你可能感兴趣的是关于simply的教程

关于Twisted,甚至其他异步网络库(例如,或),需要记住的关键一点是,您的代码只有在发生某些事情时才会被调用。我听到的最像“巫毒”的部分是回调的管理:例如,
延迟
。如果您习惯于编写直线运行的代码,并且只调用立即返回结果的函数,那么等待某个东西调用您的想法可能会令人困惑。但是回调没有什么神奇的,没有“巫毒”。在最底层,反应堆只是坐在那里,等待一小部分事情发生:

  • 数据到达连接(它将调用协议上的
    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()
    ,由类似的模块公开。我之所以说“like”
    select
    ,是因为这是一个在不同平台之间变化很大的API,而且几乎每个GUI工具包都有自己的版本。Twisted目前为此主题提供了14种不同变体的抽象接口。这种API提供的一个常见功能是提供一种方式来表示“以下是我正在等待的事件列表。在其中一个事件发生之前先睡觉,然后醒来告诉我是哪一个事件。”

    我希望您在twisted上有更好的运气。它目前是我最喜欢的框架之一。