class_docstr: Abstract class for implementing the strategy for launching worker instances within a RuntimeGroup.
  
  In order to implement a new concrete `WorkerLauncher` subclass you need to implement the start method. Please
  consider the comments of the start method because some internal variables need to be set in the concrete
  implementation.
  
  Moreover, the `setup_worker_ssh_tunnels()` method can be used to setup ssh tunnels so that all entities can talk to
  each other.
class_docstr_tok: ["Abstract","class","for","implementing","the","strategy","for","launching","worker","instances","within","a","RuntimeGroup",".","In","order","to","implement","a","new","concrete","`","WorkerLauncher","`","subclass","you","need","to","implement","the","start","method",".","Please","consider","the","comments","of","the","start","method","because","some","internal","variables","need","to","be","set","in","the","concrete","implementation",".","Moreover",",","the","`","setup_worker_ssh_tunnels","(",")","`","method","can","be","used","to","setup","ssh","tunnels","so","that","all","entities","can","talk","to","each","other","."]
docstr: Dictionary with the host as key and a port list as value. The list contains all ports where a worker instance is reachable on the respective host.
  
  Returns:
      Dict[str, List[int]]: The ports per host as a dictionary.
docstr_tok: ["Dictionary","with","the","host","as","key","and","a","port","list","as","value",".","The","list","contains","all","ports","where","a","worker","instance","is","reachable","on","the","respective","host",".","Returns",":","Dict","[","str",",","List","[","int","]","]",":","The","ports","per","host","as","a","dictionary","."]
code: def ports_per_host(self) -> Dict[str, List[int]]:
      """Dictionary with the host as key and a port list as value. The list contains all ports where a worker instance is reachable on the respective host.
  
      Returns:
          Dict[str, List[int]]: The ports per host as a dictionary.
      """
      return self._ports_per_host
  
imports: import atexit
  import logging
  from subprocess import Popen
  from typing import Dict, List, Optional, Union
  from lazycluster.exceptions import LazyclusterError
  from lazycluster.runtime_mgmt import RuntimeGroup
label_desc: Use image node_id 3 for calling the WorkerLauncher obj's underlying member method code with example usage: obj.ports_per_host() and returns: self