【问题标题】:How can I do a multithreading twisted python我怎样才能做一个多线程的扭曲蟒蛇
【发布时间】:2013-10-06 20:33:27
【问题描述】:

我有一个困扰我很长时间的问题,目前我正在研究一个处理来自外部的请求的守护进程。它就像一个服务器客户端。在这个项目中,我使用了一个 Twisted Python 框架,并且我成功地构建了一个非多线程服务器,它可以工作!但是现在,我需要同时服务多个客户。我不知道如何在 Twisted Framework 中做到这一点。我尝试了所有我知道的...

请帮帮我:|

class Server(protocol.Protocol, protocol.Factory):

def buildProtocol(self, addr):                               
    if addr.host in ipList:
        log.msg("Connected from IP: " + addr.host)
        return self
    return None

def dataReceived(self, data):
    reactor.callFromThread(self.actionCreator(data))

def actionCreator(self, data):
    jsonData = json.loads(data)
    if not jsonData["action"]:
        log.msg("Incorrect data from IP: " + self.transport.getPeer().host + " data: " + data)
        self.transport.write(json.dumps({'response' : '300'}))
    elif jsonData["action"] == 'echo':
        log.msg("Doing ask from IP: " + self.transport.getPeer().host)
        self.transport.write(json.dumps({'response' : '400', 'data' : {'status' : 'online'}}))
    elif jsonData["action"] == 'wget': 
        log.msg("Downloading file... for user - " + jsonData["user"])
        os.system("wget -q http://****************")
        self.transport.write(json.dumps({'response' : '400', 'data' : {'status' : 'downloaded'}}))
    else:
        log.msg("Incorrect data from IP: " + self.transport.getPeer().host + " data: " + data)
        self.transport.write(json.dumps({'response' : '300'}))


if __name__ == '__main__':
    try:
        log.msg("Running server...")
        context = ssl.DefaultOpenSSLContextFactory(certificate + "/server.key", certificate + "/server.crt")
        log.msg("Initiating a secure SSL connection...")
        reactor.listenSSL(config.getint(general, 'port'), Server(), context)
        log.msg("Waiting for connections...")

        reactor.run()  
    except KeyboardInterrupt:
        sys.exit()

【问题讨论】:

    标签: python multithreading twisted python-multithreading


    【解决方案1】:

    您的服务器默认处理并发客户端 - 没有线程 - 作为编程模型的属性,后跟 Twisted。

    我在您的示例代码中看不到任何使此无效的内容 - 如果您删除(损坏的)使用线程的尝试,该服务器在为多个客户端提供服务时应该没有任何问题。

    【讨论】:

    • 所以我不需要其他任何东西来同时处理多个客户端?
    • 那么你能给我举个例子我如何同时处理多个客户吗?我知道如何在 Python 中做到这一点,但在 Twisted 中却不知道。
    • 你已经给出了那个例子。正如我在回答中所说,默认情况下支持并发客户端。如果您遇到一些您认为与支持并发客户端有关的问题,请描述该问题,否则我无法告诉您如何解决。
    • 好的,我准备了一个简单的测试,我想它可以解释我的问题。当然,首先我运行我的 Deamon(服务器),然后我启动了 2 个页面和 2 个操作,两者都是 wget 查询(elif jsonData["action"] == 'wget': )。我的问题是守护进程接受并采用客户端连接,我不知道如何定义,但它会将它们添加到“等待”队列中并支持客户端后的客户端,而不是同时支持 5 个客户端?在当前要求下,daemon 必须同时支持多个客户端。 i42.tinypic.com/14ihlch.png
    • 如果你阻止了事件循环,那么它就会停止处理事件。不要使用os.system 运行wget - 使用twisted.web.client 发出HTTP 请求而不阻塞。在 Twisted 中寻找其他非阻塞 API 以完成您可能想要完成的其他任务。
    猜你喜欢
    • 2021-05-11
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多