`
standalone
  • 浏览: 595921 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Twisted中的DeferredList

阅读更多
在这个blog上学习twisted。

http://blog.163.com/gzjck_gshock/blog/static/77206203201291461538770/

里面的一个关于DeferredList的例子一开始对语法不太理解,copy并run了一遍就理解了,把代码贴在这里留作以后借鉴。

connecttest.py:

from twisted.internet import reactor, defer, protocol

class CallbackAndDisconnectProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.deferred.callback("Connected!")
        self.transport.loseConnection( )

class ConnectionTestFactory(protocol.ClientFactory):
    protocol = CallbackAndDisconnectProtocol
    def __init__(self):
        self.deferred = defer.Deferred( )

    def clientConnectionFailed(self, connector, reason):
        self.deferred.errback(reason)

def testConnect(host, port):
    testFactory = ConnectionTestFactory( )
    reactor.connectTCP(host, port, testFactory)
    return testFactory.deferred

def handleSuccess(result, port):
    print "Connected to port %i" % port
    reactor.stop( )

def handleFailure(failure, port):
    print "Error connecting to port %i: %s" % (
        port, failure.getErrorMessage( ))
    reactor.stop( )

if __name__ == "__main__":
    import sys
    if not len(sys.argv) == 3:
        print "Usage: connectiontest.py host port"
        sys.exit(1)

    host = sys.argv[1]
    port = int(sys.argv[2])
    connecting = testConnect(host, port)
    connecting.addCallback(handleSuccess, port)
    connecting.addErrback(handleFailure, port)
    reactor.run( )



portscan.py

from twisted.internet import reactor, defer
from connecttest import testConnect

def handleAllResults(results, ports):
    for port, resultInfo in zip(ports, results):
        print resultInfo
        success, result = resultInfo
        if success:
            print "Connected to port %i" % port
    reactor.stop( )

import sys

host = sys.argv[1] 
ports = range(8000, 8010)
testers = [testConnect(host, port) for port in ports]
defer.DeferredList(testers, consumeErrors=True).addCallback(
    handleAllResults, ports)
reactor.run( )



执行脚本连接localhost:

$python portscan.py 127.0.0.1
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(True, 'Connected!')
Connected to port 8007
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)

我将DeferredList中的每个Deferred打印出来就看懂handleAllResults()中的resultInfo是什么了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics