code: def _runner(self):
      while True:
          # this var will be used by eval
          l = self.g.get_vals()  # pylint: disable=unused-variable
          try:
              result = eval(self.expr)  # pylint: disable=eval-used
              if isinstance(result, Iterator):
                  for item in result:
                      self.eval_return = Evaler.EvalReturn(item, True)
              else:
                  self.eval_return = Evaler.EvalReturn(result, True)
          except Exception as ex:  # pylint: disable=broad-except
              logging.exception(
                  "Exception occured while evaluating expression: "
                  + self.expr
              )
              self.eval_return = Evaler.EvalReturn(None, True, ex)
          self.eval_wait.set()
          self.reset_wait.wait()
          if not self.continue_thread:
              break
          self.reset()
      self.running = False
      utils.debug_log("eval runner ended!")
  
file_path: tensorwatch/tensorwatch/evaler.py
imports: import threading, sys, logging
  from collections.abc import Iterator
  from .lv_types import EventData
  from functools import *
  from itertools import *
  from statistics import *
  import numpy
  from .evaler_utils import *
label_desc: Use image node_id 3 for calling the Evaler obj's underlying member method code with example usage: obj._runner() without return types