class_docstr: 用来管理训练过程中的所有的 callback 实例；
class_docstr_tok: ["\u7528\u6765\u7ba1\u7406\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u7684\u6240\u6709\u7684","callback","\u5b9e\u4f8b\uff1b"]
docstr: 注意 callback 的调用顺序为：
  
      1. 通过函数修饰器 `Trainer.on` 添加的 callback 函数；
      2. 通过 `Trainer` 的参数 `callbacks` 添加的 callback 类；
      3. 通过 `Trainer.add_callback_fn` 添加的 callback 函数；
  
  :param callbacks: 初始化时可以传入的一系列 :class:`~fastNLP.Callback` 类，通常为用户在初始化 ``Trainer`` 时直接传入的 callback 列表；
docstr_tok: ["\u6ce8\u610f","callback","\u7684\u8c03\u7528\u987a\u5e8f\u4e3a\uff1a","1",".","\u901a\u8fc7\u51fd\u6570\u4fee\u9970\u5668","`","Trainer.on","`","\u6dfb\u52a0\u7684","callback","\u51fd\u6570\uff1b","2",".","\u901a\u8fc7","`","Trainer","`","\u7684\u53c2\u6570","`","callbacks","`","\u6dfb\u52a0\u7684","callback","\u7c7b\uff1b","3",".","\u901a\u8fc7","`","Trainer.add_callback_fn","`","\u6dfb\u52a0\u7684","callback","\u51fd\u6570\uff1b",":","param","callbacks",":","\u521d\u59cb\u5316\u65f6\u53ef\u4ee5\u4f20\u5165\u7684\u4e00\u7cfb\u5217",":","class",":","`","~fastNLP.Callback","`","\u7c7b\uff0c\u901a\u5e38\u4e3a\u7528\u6237\u5728\u521d\u59cb\u5316","``","Trainer","``","\u65f6\u76f4\u63a5\u4f20\u5165\u7684","callback","\u5217\u8868\uff1b"]
code: def __init__(self, callbacks: Optional[List[Callback]]):
      r"""
      注意 callback 的调用顺序为：
  
          1. 通过函数修饰器 `Trainer.on` 添加的 callback 函数；
          2. 通过 `Trainer` 的参数 `callbacks` 添加的 callback 类；
          3. 通过 `Trainer.add_callback_fn` 添加的 callback 函数；
  
      :param callbacks: 初始化时可以传入的一系列 :class:`~fastNLP.Callback` 类，通常为用户在初始化 ``Trainer`` 时直接传入的 callback 列表；
      """
      self._need_reproducible_sampler = False
  
      self.callback_fns = defaultdict(list)
      # 因为理论上用户最多只能通过 'trainer.on_train_begin' 或者 'trainer.callback_manager.on_train_begin' 来调用，即其是没办法
      #  直接调用具体的某一个 callback 函数，而不调用其余的同名的 callback 函数的，因此我们只需要记录具体 Event 的时机即可；
      self.callback_counter = defaultdict(lambda: 0)
      if len(callbacks):
          # 这一对象是为了保存原始的类 callback 对象来帮助用户进行 debug，理论上在正常的使用中你并不会需要它；
          self.class_callbacks = callbacks
      else:
          self.class_callbacks: Optional[List[Callback]] = []
  
      # 预跑需要拿到每一个被 `Filter` 修饰的函数的 `Filter` 实例，从而在预跑结束后重置它们的内部状态；
      self._callback_filters = (
          []
      )  # [(callback_name, fn_name, filter 实例), ]
  
      # 保留所有 callback 的引用，用于断点重训；包括全部的三种callback：函数修饰器 callback；类 callback；纯函数 callback；
      # 因为所有的 callback 都是通过函数 `self.add_one_callback` 添加，因此我们选择在其下进行添加；
      # 一个比较重要的概念在于在训练过程运行的时候，两个 callback 的 callback_name 可以是一样的，并且理论上不会造成任何影响；但是当
      #  `on_load_checkpoint` 时，我们需要处理两个 callback_name 一样这种情况了；
      # 因此这里的 `all_callbacks` 为了避免正常训练过程的运行，只能是一个 List，而不能是一个 dict，`_callback_filters` 也是一样；
      self.all_callbacks = []
  
imports: import inspect
  from typing import List, Optional, Dict, Sequence
  from collections import defaultdict
  from .callback_event import Event
  from .callback import Callback
  from fastNLP.core.log import logger
  from .progress_callback import ProgressCallback, choose_progress_callback
  from ..utils.exceptions import EarlyStopException
  from ..utils.utils import _get_fun_msg
label_desc: Use image node_id 1 to create a new CallbackManager object  with example: obj = CallbackManager(callbacks)