code: def rpc(self, name, value, request=None, timeout=5.0, throw=True):
          
          done = Queue()
  
          op = super(Context, self).rpc(name, done.put_nowait, value, request=request)
  
          try:
              try:
                  result = done.get(timeout=timeout)
              except Empty:
                  result = TimeoutError()
              if throw and isinstance(result, Exception):
                  raise result
  
              return result
          except:
              op.close()
              raise
docs: Perform a Remote Procedure Call (RPC) operation
  
          :param str name: PV name string
          :param Value value: Arguments.  Must be Value instance
          :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 Value or Exception.  Subject to :py:ref:`unwrap`.
  
          >>> ctxt = Context('pva')
          >>> ctxt.rpc('pv:name:add', {'A':5, 'B'; 6})
          >>>
  
          The provided value(s) will be automatically coerced to the target type.
          If this is not possible then an Exception is raised/returned.
  
          Unless the provided value is a dict, it is assumed to be a plain value
          and an attempt is made to store it in '.value' field.