code: def _start_restricted_worker(
      self, num_cores, node_ip_address, redis_address
  ):
      extra_param = {"node-ip-address": node_ip_address}
      if self.extra_params is not None:
          extra_param.update(self.extra_params)
      command = RayServiceFuncGenerator._get_raylet_command(
          redis_address=redis_address,
          ray_exec="ray",
          redis_password=self.redis_password,
          ray_node_cpu_cores=num_cores,
          object_store_memory=self.object_store_memory,
          extra_params=extra_param,
      )
      modified_env = self.ray_service._prepare_env()
      print("Executing command: {}".format(command))
      process_info = session_execute(
          command=command,
          env=modified_env,
          tag="raylet",
          fail_fast=True,
      )
      RayServiceFuncGenerator.start_ray_daemon(
          "python",
          pid_to_watch=os.getpid(),
          pgid_to_kill=process_info.pgid,
      )
  
imports: import os
  import re
  import subprocess
  import time
  import uuid
  import random
  import warnings
  import tempfile
  import filelock
  import multiprocessing
  from packaging import version
  from zoo.ray.process import session_execute, ProcessMonitor
  from zoo.ray.utils import is_local
  from zoo.ray.utils import resource_to_bytes
  from zoo.ray.utils import get_parent_pid
label_desc: Use image node_id 12 for calling the RayContext obj's underlying member method code with example usage: obj._start_restricted_worker(num_cores, node_ip_address, redis_address) without return types