class_docstr: This is a Rate Limiter implementation for synchronous functions
  (like geocoders with the default :class:`geopy.adapters.BaseSyncAdapter`).
  
  Examples::
  
      from geopy.extra.rate_limiter import RateLimiter
      from geopy.geocoders import Nominatim
  
      geolocator = Nominatim(user_agent="specify_your_app_name_here")
  
      search = ["moscow", "paris", "berlin", "tokyo", "beijing"]
      geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)
      locations = [geocode(s) for s in search]
  
      search = [
          (55.47, 37.32), (48.85, 2.35), (52.51, 13.38),
          (34.69, 139.40), (39.90, 116.39)
      ]
      reverse = RateLimiter(geolocator.reverse, min_delay_seconds=1)
      locations = [reverse(s) for s in search]
  
  RateLimiter class is thread-safe. If geocoding service's responses
  are slower than `min_delay_seconds`, then you can benefit from
  parallelizing the work::
  
      import concurrent.futures
  
      geolocator = OpenMapQuest(api_key="...")
      geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1/20)
  
      with concurrent.futures.ThreadPoolExecutor() as e:
          locations = list(e.map(geocode, search))
  
  .. versionchanged:: 2.0
     Added thread-safety support.
code: def _acquire_request_slot(self):
      for wait in self._acquire_request_slot_gen():
          self._sleep(wait)
  
imports: import asyncio
  import inspect
  import threading
  from itertools import chain, count
  from time import sleep
  from timeit import default_timer
  from geopy.exc import GeocoderServiceError
  from geopy.util import logger
label_desc: Use image node_id 3 for calling the RateLimiter obj's underlying member method code with example usage: obj._acquire_request_slot() without return types