code: async def get(self):
          
          self._parent._check_closing()
          async with self._parent._async_not_empty:
              self._parent._sync_mutex.acquire()
              locked = True
              try:
                  do_wait = True
                  while do_wait:
                      do_wait = self._parent._qsize() == 0
  
                      if do_wait:
                          locked = False
                          self._parent._sync_mutex.release()
                          await self._parent._async_not_empty.wait()
                          self._parent._sync_mutex.acquire()
                          locked = True
  
                  item = self._parent._get()
                  self._parent._async_not_full.notify()
                  self._parent._notify_sync_not_full()
                  return item
              finally:
                  if locked:
                      self._parent._sync_mutex.release()
docs: Remove and return an item from the queue.
  
          If queue is empty, wait until an item is available.
  
          This method is a coroutine.