code: def threader(group=None, name=None, daemon=True):
      
      def decorator(job):
          """
          :param job: function to be threaded
          :rtype: wrap
          """
          def wrapped_job(queue, *args, **kwargs):
              """ this function calls the decorated function
              and puts the result in a queue
              :type queue: Queue
              """
              ret = job(*args, **kwargs)
              queue.put(ret)
  
          def wrap(*args, **kwargs):
              """ this is the function returned from the decorator. It fires off
              wrapped_f in a new thread and returns the thread object with
              the result queue attached
              :rtype: Thread
              """
              thread = Thread(group=group, target=wrapped_job, name=name, args=args, kwargs=kwargs, daemon=daemon)
              thread.start()
              return thread
          return wrap
      return decorator
docs: decorator to thread functions
      :param group: reserved for future extension when a ThreadGroup class is implemented
      :param name: thread name
      :param daemon: thread behavior
      :rtype: decorator