class_docstr: A thread-safe data structure used to respond to resource request,
     maintaining the available computation resources in each worker.
  
  Attributes:
      worker_hostname (dict): A dict to record worker hostname.
      worker_vacant_jobs (dict): Record which vacant jobs does each
                                 worker has.
      worker_used_jobs (dict): Record which used jobs does each
                                 worker has.
      master_ip (str): IP address of the master node.
class_docstr_tok: ["A","thread-safe","data","structure","used","to","respond","to","resource","request",",","maintaining","the","available","computation","resources","in","each","worker",".","Attributes",":","worker_hostname","(","dict",")",":","A","dict","to","record","worker","hostname",".","worker_vacant_jobs","(","dict",")",":","Record","which","vacant","jobs","does","each","worker","has",".","worker_used_jobs","(","dict",")",":","Record","which","used","jobs","does","each","worker","has",".","master_ip","(","str",")",":","IP","address","of","the","master","node","."]
docstr: Remove jobs, cpus, gpus from JobCenter when a worker dies.
  
  Args:
      worker_address (str): the worker_address of a worker to be
                            removed from the worker manager.
docstr_tok: ["Remove","jobs",",","cpus",",","gpus","from","JobCenter","when","a","worker","dies",".","Args",":","worker_address","(","str",")",":","the","worker_address","of","a","worker","to","be","removed","from","the","worker","manager","."]
code: def remove_worker(self, worker_address):
      """Remove jobs, cpus, gpus from JobCenter when a worker dies.
  
      Args:
          worker_address (str): the worker_address of a worker to be
                                removed from the worker manager.
      """
      with self.lock:
          self.worker_vacant_jobs.pop(worker_address, None)
          self.worker_used_jobs.pop(worker_address, None)
          self.worker_hostname.pop(worker_address, None)
          self.cpu_resource.remove_cpu(worker_address)
          self.gpu_resource.remove_gpu(worker_address)
  
imports: import threading
  import random
  from collections import defaultdict
  from collections import namedtuple
  from parl.utils import logger
  from parl.remote import remote_constants
  from parl.remote.cpu_resource import CpuResource
  from parl.remote.gpu_resource import GpuResource
  from parl.remote.message import AllocatedCpu
  from parl.remote.message import AllocatedGpu
label_desc: Use image node_id 7 for calling the WorkerManager obj's underlying member method code with example usage: obj.remove_worker(worker_address) without return types