commit cad4fb80c188e23061b220e0761db6d977e6c4b6
parent 47a97279af33295a813e7194c4d2d5e771443e51
Author: SomberNight <somber.night@protonmail.com>
Date: Wed, 12 Sep 2018 20:17:12 +0200
interface: throttle messages
Diffstat:
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/electrum/interface.py b/electrum/interface.py
@@ -49,6 +49,7 @@ class NotificationSession(ClientSession):
super(NotificationSession, self).__init__(*args, **kwargs)
self.subscriptions = defaultdict(list)
self.cache = {}
+ self.in_flight_requests_semaphore = asyncio.Semaphore(100)
async def handle_request(self, request):
# note: if server sends malformed request and we raise, the superclass
@@ -64,11 +65,14 @@ class NotificationSession(ClientSession):
assert False, request.method
async def send_request(self, *args, timeout=-1, **kwargs):
+ # note: the timeout starts after the request touches the wire!
if timeout == -1:
timeout = 20 if not self.proxy else 30
- return await asyncio.wait_for(
- super().send_request(*args, **kwargs),
- timeout)
+ # note: the semaphore implementation guarantees no starvation
+ async with self.in_flight_requests_semaphore:
+ return await asyncio.wait_for(
+ super().send_request(*args, **kwargs),
+ timeout)
async def subscribe(self, method, params, queue):
# note: until the cache is written for the first time,