Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行多线程扭曲python_Python_Multithreading_Twisted_Python Multithreading - Fatal编程技术网

如何执行多线程扭曲python

如何执行多线程扭曲python,python,multithreading,twisted,python-multithreading,Python,Multithreading,Twisted,Python Multithreading,我有一个问题困扰了我很长一段时间,目前我正在开发一个守护进程,它可以处理来自外部的请求。它就像一个服务器客户端。在这个项目中,我使用的是TwistedPython框架,我成功地构建了一个非多线程服务器,它可以工作!但是现在,我需要同时为几个客户服务。我不知道如何在Twisted框架中做到这一点。我尝试了所有我知道的 请帮我做这个:| class Server(protocol.Protocol, protocol.Factory): def buildProtocol(self, addr):

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

请帮我做这个:|

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()

默认情况下,您的服务器处理并发客户机(没有线程),这是编程模型的一个属性,后面跟着Twisted


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

因此,我不需要任何其他内容来同时处理多个客户端?因此,您能否给我一个示例,说明如何同时处理多个客户端?我知道如何用Python而不是Twisted实现这一点,您已经给出了这个示例。正如我在回答中所说,默认情况下支持并发客户端。如果您遇到一些您认为与不支持并发客户端有关的问题,请描述该问题,否则我无法告诉您如何解决。好的,我准备了一个简单的测试,我认为它可以解释我的问题。当然,在第一次运行Deamon(服务器)时,我启动了两个页面,其中包含两个操作,都是wget查询(elif jsonData[“action”]=“wget”:)。我的问题是,守护进程接受并采用客户机连接,我不知道如何定义,但它将它们添加到队列“等待”中,并支持一个接一个的客户机,而不是同时支持5个客户机?按照当前的要求,守护进程必须同时支持多个客户端。如果阻止事件循环,则它将停止处理事件。不要使用
os.system
运行
wget
-使用
twisted.web.client
发出HTTP请求而不阻塞。在Twisted中寻找其他非阻塞API,用于您可能想要完成的其他任务。