code: def check_inheritable_tags(self, create_thread):
      spark = self.spark
      spark.addTag("a")
      first = set()
      second = set()
  
      def get_inner_local_prop():
          spark.addTag("c")
          second.update(spark.getTags())
  
      def get_outer_local_prop():
          spark.addTag("b")
          first.update(spark.getTags())
          t2 = create_thread(target=get_inner_local_prop, session=spark)
          t2.start()
          t2.join()
  
      t1 = create_thread(target=get_outer_local_prop, session=spark)
      t1.start()
      t1.join()
  
      self.assertEqual(spark.getTags(), {"a"})
      self.assertEqual(first, {"a", "b"})
      self.assertEqual(second, {"a", "b", "c"})
  
imports: import threading
  import time
  import unittest
  from typing import Optional
  from pyspark import InheritableThread, inheritable_thread_target
  from pyspark.sql.connect.client import ChannelBuilder
  from pyspark.sql.connect.session import SparkSession
  from pyspark.testing.connectutils import should_test_connect
label_desc: Use image node_id 6 for calling the JobCancellationTests obj's underlying member method code with example usage: obj.check_inheritable_tags(create_thread) without return types