mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-06-08 04:38:42 +00:00
Use a task instead of a thread for heartbeats.
This commit is contained in:
parent
e2fe8c9471
commit
e3c9b6590c
@ -192,6 +192,26 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
self._dispatch_listeners = []
|
self._dispatch_listeners = []
|
||||||
# the keep alive
|
# the keep alive
|
||||||
self._keep_alive = None
|
self._keep_alive = None
|
||||||
|
self._last_ack = time.time()
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def _do_keep_alive(self, interval):
|
||||||
|
try:
|
||||||
|
while self.open:
|
||||||
|
if self._last_ack + 2 * interval < time.time():
|
||||||
|
log.warn("We have stopped responding to the gateway.")
|
||||||
|
yield from self.ws.close(1001)
|
||||||
|
break
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
'op': self.HEARTBEAT,
|
||||||
|
'd': self._connection.sequence
|
||||||
|
}
|
||||||
|
|
||||||
|
yield from self.send_as_json(payload)
|
||||||
|
yield from asyncio.sleep(interval, loop=self.loop)
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
@ -342,7 +362,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
raise ReconnectWebSocket()
|
raise ReconnectWebSocket()
|
||||||
|
|
||||||
if op == self.HEARTBEAT_ACK:
|
if op == self.HEARTBEAT_ACK:
|
||||||
self._keep_alive.ack()
|
self._last_ack = time.time()
|
||||||
return
|
return
|
||||||
|
|
||||||
if op == self.HEARTBEAT:
|
if op == self.HEARTBEAT:
|
||||||
@ -352,8 +372,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
|
|
||||||
if op == self.HELLO:
|
if op == self.HELLO:
|
||||||
interval = data['heartbeat_interval'] / 1000.0
|
interval = data['heartbeat_interval'] / 1000.0
|
||||||
self._keep_alive = KeepAliveHandler(ws=self, interval=interval)
|
self._keep_alive = compat.create_task(self._do_keep_alive(interval))
|
||||||
self._keep_alive.start()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if op == self.INVALIDATE_SESSION:
|
if op == self.INVALIDATE_SESSION:
|
||||||
@ -517,7 +536,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
|
|||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def close_connection(self, force=False):
|
def close_connection(self, force=False):
|
||||||
if self._keep_alive:
|
if self._keep_alive:
|
||||||
self._keep_alive.stop()
|
self._keep_alive.cancel()
|
||||||
|
|
||||||
yield from super().close_connection(force=force)
|
yield from super().close_connection(force=force)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user