class_docstr: This AsyncCaller tries to make it easier to async call
  
  Currently, it is used in MLflowRecorder to make functions like `log_params` async
  
  NOTE:
  - This caller didn't consider the return value
code: def async_dec(ac_attr):
      def decorator_func(func):
          def wrapper(self, *args, **kwargs):
              if isinstance(getattr(self, ac_attr, None), Callable):
                  return getattr(self, ac_attr)(
                      func, self, *args, **kwargs
                  )
              else:
                  return func(self, *args, **kwargs)
  
          return wrapper
  
      return decorator_func
  
imports: from functools import partial
  from threading import Thread
  from typing import Callable, Text, Union
  from joblib import Parallel, delayed
  from joblib._parallel_backends import MultiprocessingBackend
  import pandas
  from queue import Queue
  import concurrent
  from qlib.config import C, QlibConfig
label_desc: Use image node_id 6 for calling the AsyncCaller obj's underlying member method code with example usage: obj.async_dec(ac_attr) and returns: decorator_func, wrapper, getattr, func