mirror of
https://github.com/django/daphne.git
synced 2024-11-11 10:36:39 +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