【问题标题】:Testing twisted application - Load client测试扭曲的应用程序 - 加载客户端
【发布时间】:2010-12-11 21:24:54
【问题描述】:

我已经编写了一个基于 Twisted 的服务器,我也想使用 twisted 对其进行测试。

但我想编写一个负载测试,同时启动一堆请求。

但我相信我没有得到 Twisted 的概念,主要是客户端,因为我被这个问题困住了:

    from twisted.internet import reactor, protocol
from threading import Thread
from twisted.protocols.basic import LineReceiver

__author__="smota"
__date__ ="$30/10/2009 17:17:50$"

class SquitterClient(LineReceiver):

    def connectionMade(self):
        self.sendLine("message from " % threading.current_thread().name);
        pass

    def connectionLost(self, reason):
        print "connection lost"

    def sendMessage(self, msg):
        for m in [ "a", "b", "c", "d", "e"]:
            self.sendLine(msg % " - " % m);

class SquitterClientFactory(protocol.ClientFactory):
    protocol = SquitterClient

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost - goodbye!"
        reactor.stop()

def createAndRun():
    f = SquitterClientFactory()
    reactor.connectTCP("localhost", 4010, f)
    reactor.run(installSignalHandlers=0)

# this connects the protocol to a server runing on port 8000
def main():
    for n in range(0,10):
        th=Thread(target=createAndRun)
        th.start()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()

socket_client.py:35: 弃用警告:反应堆已经 跑步!此行为已弃用 自 Twisted 8.0
reactor.run(installSignalHandlers=0)

我错过了什么?

如何测试?

谢谢,

塞缪尔

【问题讨论】:

    标签: python multithreading twisted


    【解决方案1】:

    您失败的直接原因是您尝试多次在反应器上调用 run()。你应该只调用一次 run() 。我认为您期望有多个反应器,每个反应器都有自己的线程,但实际上您只有一个。坏事是拥有多个反应器是困难的或不可能的 - 好事是它也是不必要的。事实上,您甚至不需要多个线程。您可以在一个反应​​器中多路复用多个客户端连接,几乎就像监听多个连接一样容易。

    修改您的示例代码,如下所示应该可以工作。关键思想是您不需要多个反应器同时执行操作。无论如何,唯一可以与常规 Python 实现并发的就是 I/O。

    from twisted.internet import reactor, protocol
    from twisted.protocols.basic import LineReceiver
    
    __author__="smota"
    __date__ ="$30/10/2009 17:17:50$"
    
    class SquitterClient(LineReceiver):
        def connectionMade(self):
            self.messageCount = 0
            # The factory provides a reference to itself, we'll use it to enumerate the clients
            self.factory.n += 1
            self.name = "Client %d" %self.factory.n
    
            # Send initial message, and more messages a bit later
            self.sendLine("Client %s starting!" % self.name);
            reactor.callLater(0.5, self.sendMessage, "Message %d" %self.messageCount)
    
        def connectionLost(self, reason):
            print "connection lost"
    
        def sendMessage(self, msg):
            for m in [ "a", "b", "c", "d", "e"]:
                self.sendLine("Copy %s of message %s from client %s!" % (m, msg, self.name))
            if self.factory.stop:
                self.sendLine("Client %s disconnecting!" % self.name)
                self.transport.loseConnection()
            else:
                self.messageCount += 1
                reactor.callLater(0.5, self.sendMessage, "Message %d" %self.messageCount)
    
    class SquitterClientFactory(protocol.ClientFactory):
        protocol = SquitterClient
    
        def __init__(self):
            self.n = 0
            self.stop = False
    
        def stopTest():
            self.stop = True
    
        def clientConnectionFailed(self, connector, reason):
            print "Connection failed - goodbye!"
    
        def clientConnectionLost(self, connector, reason):
            print "Connection lost - goodbye!"
    
    # this connects the protocol to a server running on port 8000
    def main():
        # Create 10 clients
    
        f = SquitterClientFactory()
        for i in range(10):
            reactor.connectTCP("localhost", 8000, f)
    
        # Schedule end of test in 10 seconds
        reactor.callLater(10, f.stopTest)
    
        # And let loose the dogs of war
        reactor.run()
    
    # this only runs if the module was *not* imported
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • 您可能还想指出多个 /threads/ 也不是必需的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2013-05-17
    • 2012-07-03
    相关资源
    最近更新 更多