class_docstr: When we repeatedly run functions, it is hard to avoid memory leakage.
  So we run it in the subprocess to ensure it is OK.
  
  NOTE: Because local object can't be pickled. So we can't implement it via closure.
        We have to implement it via callable Class
docstr: Parameters
  ----------
  func : Callable
      the function to be wrapped
  
  qlib_config : QlibConfig
      Qlib config for initialization in subprocess
  
  Returns
  -------
  Callable
docstr_tok: ["Parameters","--","--","--","--","--","func",":","Callable","the","function","to","be","wrapped","qlib_config",":","QlibConfig","Qlib","config","for","initialization","in","subprocess","Returns","--","--","--","-","Callable"]
code: def __init__(self, func: Callable, qlib_config: QlibConfig = None):
      """
      Parameters
      ----------
      func : Callable
          the function to be wrapped
  
      qlib_config : QlibConfig
          Qlib config for initialization in subprocess
  
      Returns
      -------
      Callable
      """
      self.func = func
      self.qlib_config = qlib_config
  
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 1 to create a new call_in_subproc object  with example: obj = call_in_subproc(func, qlib_config)