docs: def get(self, name, request=None, timeout=5.0, throw=True):
          """Fetch current value of some number of PVs.
  
          :param name: A single name string or list of name strings
          :param request: A :py:class:`p4p.Value` or string to qualify this request, or None to use a default.
          :param float timeout: Operation timeout in seconds
          :param bool throw: When true, operation error throws an exception.  If False then the Exception is returned instead of the Value
  
          :returns: A p4p.Value or Exception, or list of same.  Subject to :py:ref:`unwrap`.
  
          When invoked with a single name then returns is a single value.
          When invoked with a list of name, then returns a list of values
  
          >>> ctxt = Context('pva')
          >>> V = ctxt.get('pv:name')
          >>> A, B = ctxt.get(['pv:1', 'pv:2'])
          >>>
          """
          singlepv = isinstance(name, (bytes, unicode))
          if singlepv:
              name = [name]
              request = [request]
  
          elif request is None:
              request = [None] * len(name)
  
          assert len(name) == len(request), (name, request)
  
          # use Queue instead of Event to allow KeyboardInterrupt
          done = Queue()
          result = [TimeoutError()] * len(name)
          ops = [None] * len(name)
  
          raw_get = super(Context, self).get
  
          try:
              for i, (N, req) in enumerate(izip(name, request)):
                  def cb(value, i=i):
                      try:
                          if not isinstance(value, Cancelled):
                              done.put_nowait((value, i))
                          _log.debug('get %s Q %s', N, LazyRepr(value))
                      except:
                          _log.exception("Error queuing get result %s", value)
  
                  _log.debug('get %s w/ %s', N, req)
                  ops[i] = raw_get(N, cb, request=req)
  
              for _n in range(len(name)):
                  try:
                      value, i = done.get(timeout=timeout)
                  except Empty:
                      if throw:
                          _log.debug('timeout %s after %s', name[i], timeout)
                          raise TimeoutError()
                      break
                  _log.debug('got %s %s', name[i], LazyRepr(value))
                  if throw and isinstance(value, Exception):
                      raise value
                  result[i] = value
  
          finally:
              [op and op.close() for op in ops]
  
          if singlepv:
              return result[0]
          else:
              return result