aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2017-04-01 23:26:44 -0400
committerRapptz <[email protected]>2017-04-01 23:31:32 -0400
commitff95258710c2ceafb67d706bca6fa034287e2739 (patch)
tree873f24a315ae96b0a6591a1b259bc5cd5686752f
parentProper termination of HistoryIterator.flatten. (diff)
downloaddiscord.py-ff95258710c2ceafb67d706bca6fa034287e2739.tar.xz
discord.py-ff95258710c2ceafb67d706bca6fa034287e2739.zip
Use an asyncio.Event instead of an asyncio.Lock for global rate limits.
There were some dead-locking issues that I suspect were due to the way the global rate limit was handled. This changes it into a simple Event that allows multiple coroutines to pass through instead of one by one.
-rw-r--r--discord/http.py14
1 files changed, 8 insertions, 6 deletions
diff --git a/discord/http.py b/discord/http.py
index 34db788f..9f43faad 100644
--- a/discord/http.py
+++ b/discord/http.py
@@ -92,7 +92,8 @@ class HTTPClient:
self.connector = connector
self._session = aiohttp.ClientSession(connector=connector, loop=self.loop)
self._locks = weakref.WeakValueDictionary()
- self._global_lock = asyncio.Lock(loop=self.loop)
+ self._global_over = asyncio.Event(loop=self.loop)
+ self._global_over.set()
self.token = None
self.bot_token = False
@@ -126,9 +127,9 @@ class HTTPClient:
kwargs['headers'] = headers
- if self._global_lock.locked():
+ if not self._global_over.is_set():
# wait until the global lock is complete
- yield from self._global_lock
+ yield from self._global_over.wait()
yield from lock
with MaybeUnlock(lock) as maybe_lock:
@@ -172,15 +173,16 @@ class HTTPClient:
is_global = data.get('global', False)
if is_global:
log.info('Global rate limit has been hit. Retrying in {:.2} seconds.'.format(retry_after))
- # acquire the global lock and block all processing
- yield from self._global_lock
+ self._global_over.clear()
yield from asyncio.sleep(retry_after, loop=self.loop)
+ log.debug('Done sleeping for the rate limit. Retrying...')
# release the global lock now that the
# global rate limit has passed
if is_global:
- self._global_lock.release()
+ self._global_over.set()
+ log.debug('Global rate limit is now over.')
continue