code: def test_multi_process_runner_error_propagates_from_subprocesses(
      self,
  ):
      runner = multi_process_runner.MultiProcessRunner(
          fn_that_errors,
          multi_worker_test_base.create_cluster_spec(
              num_workers=1, num_ps=1
          ),
          max_run_time=20,
      )
      runner.start()
      with self.assertRaisesRegex(ValueError, "This is an error."):
          runner.join()
  
imports: import ctypes
  import json
  import os
  import sys
  import threading
  import time
  import unittest
  from absl import logging
  from absl.testing import parameterized
  from tensorflow.python.distribute import combinations
  from tensorflow.python.distribute import multi_process_runner
  from tensorflow.python.distribute import multi_worker_test_base
  from tensorflow.python.eager import context
  from tensorflow.python.eager import test
label_desc: Use image node_id 3 for calling the MultiProcessRunnerTest obj's underlying member method code with example usage: obj.test_multi_process_runner_error_propagates_from_subprocesses() without return types