mirror of
				https://github.com/django/daphne.git
				synced 2025-11-04 09:37:32 +03:00 
			
		
		
		
	Don't use call in thread because it blocks the main serving thread
This commit is contained in:
		
							parent
							
								
									1709522162
								
							
						
					
					
						commit
						aa6c0a73e6
					
				| 
						 | 
					@ -34,6 +34,7 @@ class WebRequest(http.Request):
 | 
				
			||||||
        self._got_response_start = False
 | 
					        self._got_response_start = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def process(self):
 | 
					    def process(self):
 | 
				
			||||||
 | 
					        self.request_start = time.time()
 | 
				
			||||||
        # Get upgrade header
 | 
					        # Get upgrade header
 | 
				
			||||||
        upgrade_header = None
 | 
					        upgrade_header = None
 | 
				
			||||||
        if self.requestHeaders.hasHeader(b"Upgrade"):
 | 
					        if self.requestHeaders.hasHeader(b"Upgrade"):
 | 
				
			||||||
| 
						 | 
					@ -156,6 +157,7 @@ class WebRequest(http.Request):
 | 
				
			||||||
                "status": self.code,
 | 
					                "status": self.code,
 | 
				
			||||||
                "method": self.method.decode("ascii"),
 | 
					                "method": self.method.decode("ascii"),
 | 
				
			||||||
                "client": "%s:%s" % (self.client.host, self.client.port),
 | 
					                "client": "%s:%s" % (self.client.host, self.client.port),
 | 
				
			||||||
 | 
					                "time_taken": time.time() - self.request_start,
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            logger.debug("HTTP response chunk for %s", self.reply_channel)
 | 
					            logger.debug("HTTP response chunk for %s", self.reply_channel)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,30 +19,23 @@ class Server(object):
 | 
				
			||||||
    def run(self):
 | 
					    def run(self):
 | 
				
			||||||
        self.factory = HTTPFactory(self.channel_layer, self.action_logger)
 | 
					        self.factory = HTTPFactory(self.channel_layer, self.action_logger)
 | 
				
			||||||
        reactor.listenTCP(self.port, self.factory, interface=self.host)
 | 
					        reactor.listenTCP(self.port, self.factory, interface=self.host)
 | 
				
			||||||
        reactor.callInThread(self.backend_reader)
 | 
					        reactor.callLater(0, self.backend_reader)
 | 
				
			||||||
        reactor.run(installSignalHandlers=self.signal_handlers)
 | 
					        reactor.run(installSignalHandlers=self.signal_handlers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def backend_reader(self):
 | 
					    def backend_reader(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        Run in a separate thread; reads messages from the backend.
 | 
					        Run in a separate thread; reads messages from the backend.
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        while True:
 | 
					        channels = self.factory.reply_channels()
 | 
				
			||||||
            channels = self.factory.reply_channels()
 | 
					        # Quit if reactor is stopping
 | 
				
			||||||
            # Quit if reactor is stopping
 | 
					        if not reactor.running:
 | 
				
			||||||
            if not reactor.running:
 | 
					            logging.debug("Backend reader quitting due to reactor stop")
 | 
				
			||||||
                logging.debug("Backend reader quitting due to reactor stop")
 | 
					            return
 | 
				
			||||||
                return
 | 
					        # Don't do anything if there's no channels to listen on
 | 
				
			||||||
            # Don't do anything if there's no channels to listen on
 | 
					        if channels:
 | 
				
			||||||
            if channels:
 | 
					            channel, message = self.channel_layer.receive_many(channels, block=False)
 | 
				
			||||||
                channel, message = self.channel_layer.receive_many(channels, block=False)
 | 
					            if channel:
 | 
				
			||||||
                if channel:
 | 
					                logging.debug("Server got message on %s", channel)
 | 
				
			||||||
                    logging.debug("Server got message on %s", channel)
 | 
					                # Deal with the message
 | 
				
			||||||
            else:
 | 
					                self.factory.dispatch_reply(channel, message)
 | 
				
			||||||
                time.sleep(0.1)
 | 
					        reactor.callLater(0, self.backend_reader)
 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
            # Wait around if there's nothing received
 | 
					 | 
				
			||||||
            if channel is None:
 | 
					 | 
				
			||||||
                time.sleep(0.05)
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
            # Deal with the message
 | 
					 | 
				
			||||||
            self.factory.dispatch_reply(channel, message)
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user