docs: def get(sender, topic, *args, **kwargs):
      """
      Invoke receiver functions according topic, it'll invoke receiver functions one by one,
      and if one receiver function return non-None value, it'll return it and break
      the loop.
      """
      if not topic in _receivers:
          return
      items = _receivers[topic]
      def _cmp(x, y):
          return cmp(x[0], y[0])
      
      items.sort(_cmp)
      for i in range(len(items)):
          nice, f = items[i]
          _f = f['func']
          if not _f:
              try:
                  _f = import_attr(f['func_name'])
              except ImportError:
                  logging.error("Can't import function %s" % f['func_name'])
                  raise
              f['func'] = _f
          if callable(_f):
              if not _test(kwargs, f):
                  continue
              try:
                  v = _f(sender, *args, **kwargs)
              except:
                  func = _f.__module__ + '.' + _f.__name__
                  logging.exception('Calling dispatch point [%s] %s(%r,%r) error!' % (topic, func, args, kwargs))
                  raise
              if v is not None:
                  return v
          else:
              raise "Dispatch point [%s] %r can't been invoked" % (topic, _f)