docstr: See ZMQBroadcastServer.safe_start().
docstr_tok: ["See","ZMQBroadcastServer.safe_start","(",")","."]
code: def safe_start(self) -> None:
      """
      See ZMQBroadcastServer.safe_start().
      """
  
      # Get the first HelloMessage to guarantee our SUB socket is connected.
      obj = self._sub_socket.recv_pyobj()
      if not isinstance(obj, _HelloMessage):
          raise RuntimeError(
              f"got non-_HelloMessage: {type(obj).__name__}"
          )
  
      # Send our own _HelloMessage.
      self._push_socket.send_pyobj(_HelloMessage())
  
      while True:
          # Discard all further Hellos until the FinalHello.
          obj = self._sub_socket.recv_pyobj()
          if isinstance(obj, _FinalHelloMessage):
              break
          if not isinstance(obj, _HelloMessage):
              raise RuntimeError(
                  f"got non-_HelloMessage: {type(obj).__name__}"
              )
  
imports: import logging
  import os
  import selectors
  import signal
  import socket
  import subprocess
  import time
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
  import determined
label_desc: Use image node_id 2 for calling the ZMQBroadcastClient obj's underlying member method code with example usage: obj.safe_start() without return types