Skip to content

Commit a08f175

Browse files
converted the internal concurrent request counter to asyncio.Semaphore
1 parent 18a7a9a commit a08f175

2 files changed

Lines changed: 5 additions & 61 deletions

File tree

meraki/aio/rest_session.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ def __init__(
5151
self._retry_4xx_error_wait_time = retry_4xx_error_wait_time
5252
self._maximum_retries = maximum_retries
5353
self._simulate = simulate
54-
self._maximum_concurrent_sessions = maximum_concurrent_requests
55-
self._current_sessions = 0
54+
self._concurrent_requests_semaphore = asyncio.Semaphore(maximum_concurrent_requests)
5655
self._be_geo_id = be_geo_id
5756
self._caller = caller
5857

@@ -91,14 +90,8 @@ def __init__(
9190
self._logger.info(f"Meraki dashboard API session initialized with these parameters: {self._parameters}")
9291

9392
async def request(self, metadata, method, url, **kwargs):
94-
while self._current_sessions >= self._maximum_concurrent_sessions:
95-
await asyncio.sleep(0.3) # wait for a free slot
96-
97-
self._current_sessions = self._current_sessions + 1
98-
try:
93+
async with self._concurrent_requests_semaphore:
9994
return await self._request(metadata, method, url, allow_redirects=False, **kwargs)
100-
finally:
101-
self._current_sessions = self._current_sessions - 1
10295

10396
async def _request(self, metadata, method, url, **kwargs):
10497
# Metadata on endpoint

meraki_v0/aio/rest_session.py

Lines changed: 3 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,49 +11,7 @@
1111
from ..config import *
1212
from ..exceptions import *
1313
from ..__init__ import __version__
14-
15-
16-
def user_agent_extended(be_geo_id, caller):
17-
# Generate extended portion of the User-Agent
18-
user_agent_extended = be_geo_id
19-
user_agent_extended = {}
20-
21-
# Mimic pip system data collection per https://github.com/pypa/pip/blob/master/src/pip/_internal/network/session.py
22-
user_agent_extended['implementation'] = {
23-
"name": platform.python_implementation(),
24-
}
25-
26-
if user_agent_extended["implementation"]["name"] in ('CPython','Jython','IronPython'):
27-
user_agent_extended["implementation"]["version"] = platform.python_version()
28-
elif user_agent_extended["implementation"]["name"] == 'PyPy':
29-
if sys.pypy_version_info.releaselevel == 'final':
30-
pypy_version_info = sys.pypy_version_info[:3]
31-
else:
32-
pypy_version_info = sys.pypy_version_info
33-
user_agent_extended["implementation"]["version"] = ".".join(
34-
[str(x) for x in pypy_version_info]
35-
)
36-
37-
if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
38-
user_agent_extended["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]}
39-
40-
if platform.system():
41-
user_agent_extended.setdefault("system", {})["name"] = platform.system()
42-
43-
if platform.release():
44-
user_agent_extended.setdefault("system", {})["release"] = platform.release()
45-
46-
if platform.machine():
47-
user_agent_extended["cpu"] = platform.machine()
48-
49-
if be_geo_id:
50-
user_agent_extended["be_geo_id"] = be_geo_id
51-
52-
if caller:
53-
user_agent_extended["caller"] = caller
54-
55-
return urllib.parse.quote(json.dumps(user_agent_extended))
56-
14+
from ..rest_session import user_agent_extended
5715

5816
# Main module interface
5917
class AsyncRestSession:
@@ -92,8 +50,7 @@ def __init__(
9250
self._retry_4xx_error_wait_time = retry_4xx_error_wait_time
9351
self._maximum_retries = maximum_retries
9452
self._simulate = simulate
95-
self._maximum_concurrent_sessions = maximum_concurrent_requests
96-
self._current_sessions = 0
53+
self._concurrent_requests_semaphore = asyncio.Semaphore(maximum_concurrent_requests)
9754
self._be_geo_id = be_geo_id
9855
self._caller = caller
9956

@@ -132,14 +89,8 @@ def __init__(
13289
self._logger.info(f"Meraki dashboard API session initialized with these parameters: {self._parameters}")
13390

13491
async def request(self, metadata, method, url, **kwargs):
135-
while self._current_sessions >= self._maximum_concurrent_sessions:
136-
await asyncio.sleep(0.3) # wait for a free slot
137-
138-
self._current_sessions = self._current_sessions + 1
139-
try:
92+
async with self._concurrent_requests_semaphore:
14093
return await self._request(metadata, method, url, allow_redirects=False, **kwargs)
141-
finally:
142-
self._current_sessions = self._current_sessions - 1
14394

14495
async def _request(self, metadata, method, url, **kwargs):
14596
# Metadata on endpoint

0 commit comments

Comments
 (0)