class_docstr: Monitor to keep track of all clients using this service.
  
  This is only used for services that use multiple clients, e.g. the database
  service. In addition to tracking the original parent process, other
  processes can also request to be tracked by sending a message to this
  process as a tuple: ("register", PID). trigger_exit(PARENT) is only called
  after the original parent and all registered clients have shut down.
class_docstr_tok: ["Monitor","to","keep","track","of","all","clients","using","this","service",".","This","is","only","used","for","services","that","use","multiple","clients",",","e.g",".","the","database","service",".","In","addition","to","tracking","the","original","parent","process",",","other","processes","can","also","request","to","be","tracked","by","sending","a","message","to","this","process","as","a","tuple",":","(","``","register","''",",","PID",")",".","trigger_exit","(","PARENT",")","is","only","called","after","the","original","parent","and","all","registered","clients","have","shut","down","."]
docstr: Notifies _background_loop that a client has exited.
docstr_tok: ["Notifies","_background_loop","that","a","client","has","exited","."]
code: def _notify_exit(self, process):
      """Notifies _background_loop that a client has exited."""
      with self.cond:
          self.clients.remove(process)
          self.cond.notify_all()
  
imports: import argparse
  import collections
  import enum
  import os
  import signal
  import subprocess
  import sys
  import threading
  import traceback
  import psutil
  from fiftyone.service.ipc import IPCServer
label_desc: Use image node_id 5 for calling the ClientMonitor obj's underlying member method code with example usage: obj._notify_exit(process) without return types