Twisted Python一次响应多个客户端

时间:2016-11-11 13:10:44

标签: python-2.7 twisted

我有问题。我有一个接受客户并处理他的要求的超级服务器,它将结果返回给客户。

假设我有两个客户端,1个客户端要求处理时间为10秒,2个客户端要求处理时间为1秒。

因此,当两个客户端一次连接到服务器时。如何平行地同时运行两个客户端任务并将响应返回给先完成的特定客户端。

我已经读过,我们可以使用python twisted实现这个问题。我试过运气,但我无法做到。

请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

您的代码(https://trinket.io/python/87fd18ca9e)在异步设计模式方面存在许多错误,但我只会解决最明显的错误。有几次调用time.sleep(),这是阻塞代码并导致代码停止,直到睡眠功能运行完毕。 async编程的第1号规则不使用阻塞函数!别担心,这是一个非常常见的错误,Twisted和Python异步社区可以帮助你:)我会为你的服务器提供一个天真的解决方案:

from twisted.internet.protocol import Factory
from twisted.internet import reactor, protocol, defer, task

def sleep(n):
    return task.deferLater(reactor, n, lambda: None)

class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory

    def connectionMade(self):
        self.factory.numConnections += 1

    @defer.inlineCallbacks
    def recur_factorial(self,n):
        fact=1
        print(n)
        for i in range(1,int(n)+1):
            fact=fact*i
        yield sleep(5)    # async sleep
        defer.returnValue(str(fact))

    def dataReceived(self, data):
        try:
            number = int(data)      # validate data is an int
        except ValueError:
            self.transport.write('Invalid input!')
            return                  # "exit" otherwise

        # use Deferreds to write to client after calculation is finished
        deferred_factorial = self.recur_factorial(number)
        deferred_factorial.addCallback(self.transport.write)

    def connectionLost(self, reason):
        self.factory.numConnections -= 1

class QuoteFactory(Factory):
    numConnections = 0

    def buildProtocol(self, addr):
        return QuoteProtocol(self)

reactor.listenTCP(8000, QuoteFactory())
reactor.run()

主要区别在recur_factorial()dataReceived()recur_factorial()现在正在使用Deferred(搜索inlineCallbacks或coroutine的工作方式),它允许在结果可用后执行函数。因此,当收到数据时,计算阶乘,然后写入最终用户。最后是新的sleep()函数,它允许异步睡眠功能。我希望这有帮助。继续阅读Krondo博客。