class_docstr: A thread that watches for new runs and sends the run_id to the
  card server when a new run is detected. It observes the `latest_run`
  file in the `.metaflow/<flowname>` directory.
class_docstr_tok: ["A","thread","that","watches","for","new","runs","and","sends","the","run_id","to","the","card","server","when","a","new","run","is","detected",".","It","observes","the","`","latest_run","`","file","in","the","`",".metaflow\/","<","flowname",">","`","directory","."]
code: def get_run_id(self):
      if not os.path.exists(self._watch_file):
          return None
      with open(self._watch_file, "r") as f:
          return f.read().strip()
  
imports: import os
  import json
  from http.server import BaseHTTPRequestHandler
  from threading import Thread
  from multiprocessing import Pipe
  from multiprocessing.connection import Connection
  from urllib.parse import urlparse
  import time
  from .card_client import CardContainer
  from .exception import CardNotPresentException
  from .card_resolver import resolve_paths_from_task
  from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
  from metaflow import namespace
  from metaflow.exception import CommandException, MetaflowNotFound, MetaflowNamespaceMismatch
label_desc: Use image node_id 2 for calling the RunWatcher obj's underlying member method code with example usage: obj.get_run_id() and returns: None, f