def watch_run(self, run_id: str, start_cursor: int, callback: Callable[([EventLogEntry], None)]):
    run_id = check.str_param(run_id, 'run_id')
    start_cursor = check.int_param(start_cursor, 'start_cursor')
    callback = check.callable_param(callback, 'callback')
    with self._dict_lock:
        if (run_id not in self._run_id_to_watcher_dict):
            self._run_id_to_watcher_dict[run_id] = SqlPollingRunIdEventWatcherThread(self._event_log_storage, run_id)
            self._run_id_to_watcher_dict[run_id].daemon = True
            self._run_id_to_watcher_dict[run_id].start()
        self._run_id_to_watcher_dict[run_id].add_callback(start_cursor, callback)
def watch_run(self, run_id: str, start_cursor: int, callback: Callable[([EventLogEntry], None)]):
    run_id = check.str_param(run_id, 'run_id')
    start_cursor = check.int_param(start_cursor, 'start_cursor')
    callback = check.callable_param(callback, 'callback')
    with self._dict_lock:
        if (run_id not in self._run_id_to_watcher_dict):
            self._run_id_to_watcher_dict[run_id] = SqlPollingRunIdEventWatcherThread(self._event_log_storage, run_id)
            self._run_id_to_watcher_dict[run_id].daemon = True
            self._run_id_to_watcher_dict[run_id].start()
        self._run_id_to_watcher_dict[run_id].add_callback(start_cursor, callback)