class_docstr: A collection of callbacks added to a Tornado IOLoop that can be removed
  as a group.
class_docstr_tok: ["A","collection","of","callbacks","added","to","a","Tornado","IOLoop","that","can","be","removed","as","a","group","."]
docstr: Adds a callback to be run every period_milliseconds until it is removed.
  
  The passed-in ID can be used with remove_periodic_callback.
docstr_tok: ["Adds","a","callback","to","be","run","every","period_milliseconds","until","it","is","removed",".","The","passed-in","ID","can","be","used","with","remove_periodic_callback","."]
code: def add_periodic_callback(
      self,
      callback: Callback,
      period_milliseconds: int,
      callback_id: ID,
  ) -> None:
      """Adds a callback to be run every period_milliseconds until it is removed.
  
      The passed-in ID can be used with remove_periodic_callback.
  
      """
      cb = _AsyncPeriodic(
          callback, period_milliseconds, io_loop=self._loop
      )
      self._assign_remover(
          callback,
          callback_id,
          self._periodic_callback_removers,
          cb.stop,
      )
      cb.start()
  
imports: from __future__ import annotations
  import logging
  import sys
  import threading
  from collections import defaultdict
  from traceback import format_exception
  from typing import TYPE_CHECKING, Any, Awaitable, Callable, Union
  import tornado
  from tornado import gen
  from ..core.types import ID
label_desc: Use image node_id 10 for calling the _CallbackGroup obj's underlying member method code with example usage: obj.add_periodic_callback(callback, period_milliseconds, callback_id) without return types