Browse Source

interface: throttle messages

master
SomberNight 7 years ago
parent
commit
cad4fb80c1
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 4
      electrum/interface.py

4
electrum/interface.py

@ -49,6 +49,7 @@ class NotificationSession(ClientSession):
super(NotificationSession, self).__init__(*args, **kwargs) super(NotificationSession, self).__init__(*args, **kwargs)
self.subscriptions = defaultdict(list) self.subscriptions = defaultdict(list)
self.cache = {} self.cache = {}
self.in_flight_requests_semaphore = asyncio.Semaphore(100)
async def handle_request(self, request): async def handle_request(self, request):
# note: if server sends malformed request and we raise, the superclass # note: if server sends malformed request and we raise, the superclass
@ -64,8 +65,11 @@ class NotificationSession(ClientSession):
assert False, request.method assert False, request.method
async def send_request(self, *args, timeout=-1, **kwargs): async def send_request(self, *args, timeout=-1, **kwargs):
# note: the timeout starts after the request touches the wire!
if timeout == -1: if timeout == -1:
timeout = 20 if not self.proxy else 30 timeout = 20 if not self.proxy else 30
# note: the semaphore implementation guarantees no starvation
async with self.in_flight_requests_semaphore:
return await asyncio.wait_for( return await asyncio.wait_for(
super().send_request(*args, **kwargs), super().send_request(*args, **kwargs),
timeout) timeout)

Loading…
Cancel
Save