Skip to content

Commit 30a0ef6

Browse files
author
Shiyue Cheng
authored
Merge pull request meraki#119 from coreGreenberet/asyncio_semaphore
Asyncio semaphore
2 parents e2e3107 + a08f175 commit 30a0ef6

2 files changed

Lines changed: 6 additions & 104 deletions

File tree

meraki/aio/rest_session.py

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

5917
# Main module interface
6018
class AsyncRestSession:
@@ -93,8 +51,7 @@ def __init__(
9351
self._retry_4xx_error_wait_time = retry_4xx_error_wait_time
9452
self._maximum_retries = maximum_retries
9553
self._simulate = simulate
96-
self._maximum_concurrent_sessions = maximum_concurrent_requests
97-
self._current_sessions = 0
54+
self._concurrent_requests_semaphore = asyncio.Semaphore(maximum_concurrent_requests)
9855
self._be_geo_id = be_geo_id
9956
self._caller = caller
10057

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

13592
async def request(self, metadata, method, url, **kwargs):
136-
while self._current_sessions >= self._maximum_concurrent_sessions:
137-
await asyncio.sleep(0.3) # wait for a free slot
138-
139-
self._current_sessions = self._current_sessions + 1
140-
try:
93+
async with self._concurrent_requests_semaphore:
14194
return await self._request(metadata, method, url, allow_redirects=False, **kwargs)
142-
finally:
143-
self._current_sessions = self._current_sessions - 1
14495

14596
async def _request(self, metadata, method, url, **kwargs):
14697
# 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)