如何在twisted中使用deferred进行异步事件处理

时间:2014-02-16 09:02:43

标签: python asynchronous twisted

我有一个客户端和这个客户端shoud读取服务器事件。我想知道如何使这段代码异步。我看到了defferd的例子,但我没有得到如何以正确的方式将它用于传入事件。

class EchoClient(protocol.Protocol):


    def dataReceived(self, data):
        d = Deferred()
        d.addCallback(self.incoming_event)
        d.callback(data)

    def incoming_event(self,data):
        #some thing



class EchoFactory(protocol.ClientFactory):
    protocol = EchoClient
    def __init__(self, app):
        self.app = app
    def clientConnectionFailed(self, connector, reason):
        print "Connection failed."
        reactor.stop()
    def clientConnectionLost(self, connector, reason):
        print "Connection lost."
        reactor.stop()

当我有很多事件时,这个事件的处理是一个接一个,我需要他们一起处理。有没有扭曲的方式?或者我需要把它们放在那里?

1 个答案:

答案 0 :(得分:1)

Twisted是一个合作的多任务系统。它为多线程提供了一些支持,但必须明确使用任何多线程。单线程多任务系统不会同时运行多个任务。他们不能。这是他们力量的一部分(多线程程序员更难编写,理解和调试)。

许多很多很多基于Twisted的程序都是单线程的,工作得很好。您还没有解释为什么程序中的事件是逐个处理的问题。

我猜可能是因为它们在很短的时间内存在很多,并且处理它们会妨碍GUI的更新。如果是这种情况,那么也许您可以通过提高GUI事件的优先级来解决问题(Gtk允许您这样做)或对一次处理多少非GUI事件施加一些人为限制。