class_docstr: Store is a central place to register and unregister services.
  Other components can subscribe to updates.
  Its internal state could be serialized to a file and restored from it using pydantic.
class_docstr_tok: ["Store","is","a","central","place","to","register","and","unregister","services",".","Other","components","can","subscribe","to","updates",".","Its","internal","state","could","be","serialized","to","a","file","and","restored","from","it","using","pydantic","."]
code: def start_tunnels(self):
      with ThreadPoolExecutor(max_workers=8) as executor:
          futures = [
              executor.submit(supress_exc(tunnel.start))
              for domain, (service, tunnel) in self.services.items()
          ]
          concurrent.futures.wait(futures)
  
imports: import asyncio
  import concurrent
  import functools
  import logging
  import os
  from abc import ABC, abstractmethod
  from asyncio import Lock
  from collections import defaultdict
  from concurrent.futures import ThreadPoolExecutor
  from contextlib import AsyncExitStack
  from functools import lru_cache
  from pathlib import Path
  from typing import DefaultDict, Dict, List, Set, Tuple
  from pydantic import BaseModel, Field, PrivateAttr
  from dstack.gateway.common import run_async
  from dstack.gateway.errors import GatewayError
  from dstack.gateway.schemas import Service
  from dstack.gateway.services.nginx import Nginx
  from dstack.gateway.services.persistent import get_persistent_state
  from dstack.gateway.services.tunnel import SSHTunnel
label_desc: Use image node_id 1 for calling the Store obj's underlying member method code with example usage: obj.start_tunnels() without return types