通过扭曲在客户端创建大量连接

时间:2014-07-28 09:50:13

标签: twisted

我使用twisted来为服务器做一个测试工作。我需要创建很多连接到服务器的连接。这是我的代码:

class Account(Protocol):
    def connectionMade(self):
        print "connection made"
    def connectionLost(self, reason):
        print "connection Lost. reason: ", reason
    def createAccount(self, name):
        self.transport.write(...)
        print "create account: ", name

class AccountFactory(Factory):
    def buildProtocol(self, addr):
        return Account()

def accountCreate(p, i):
    print "begin create"
    p.createAccount(NAME_PREFIX+str(i))

def onError(err):
    return 'error: ', err

c = 0
while c < 100: 
    accountPoint = TCP4ClientEndpoint(reactor, server_ip, port)
    accountConn = accountPoint.connect(AccountFactory())

    accountConn.addCallback(accountCreate, c)
    accountConn.addErrback(onError)
    c += 1

reactor.run()

如果服务器和客户端位于同一局域网中,则没有问题,所有100&#34;创建帐户:xxx&#34;将打印。但是当我将服务器放在远程地址(互联网)上时,客户端只能打印近50%的&#34;创建帐户:xxx&#34;。 onError无法解雇。

日志是:

2014-07-29 15:57:06+0800 [Uninitialized] connection made
2014-07-29 15:57:06+0800 [Uninitialized] begin create
2014-07-29 15:57:06+0800 [Uninitialized] create account: xxx
repeat 60 times
2014-07-29 15:57:17+0800 [Uninitialized] Stopping factory <__main__.AccountFactory instance at xxx>
repeat 40 times

有些回调未能通话,即使没有联系。唯一不同的是服务器和客户端之间的延迟。

最感兴趣的是第一次成功记录和第一次成功记录之间的持续时间&#34;停止工厂&#34;日志恰好是20秒(我试了很多次)。但我确信这不是由超时引起的,因为TCP4ClientEndpoint默认超时为30秒。

并且日志时间戳也异常,日志时间戳是捆绑的,例如:10个日志是2014-07-29 17:25:09,20个日志是2014-07-29 17:25:15 。如果以异步方式建立连接,则时间戳应足够随机。它不应该聚集在一起:在时间点a建立10个连接,在时间点a + 15秒创建另外20个连接。还是记录实用程序问题?

修: 我认为这是扭曲的错误。 &#34;停止&#34;的原因超时。当我在linux中运行时,第一次登录和第一次停止之间的持续时间是我传递到TCP4ClientEndpoint的超时秒数,但在Windows下,无论我设置超时秒数,持续时间总是21秒。我使用socket(阻塞)来做同样的事情,一切都很好。因此,这应该是一个扭曲的错误,在进行大量连接时会涉及超时。

1 个答案:

答案 0 :(得分:1)

您尚未在代码中添加任何错误处理程序,也没有启用日志记录,以便在任何地方报告未处理的错误。

启用日志记录,方法是调用twisted.python.log.startLogging或将代码编写为ISeviceMaker插件并使用twistd运行。

并为应用程序中的每个Deferred添加errback,以便您可以处理其关联操作中的失败。