class_docstr: The Copier is a thread running alongside a LightningWork.
  
  It maintains two queues that connect to the central
  :class:`~lightning.app.storage.orchestrator.StorageOrchestrator`,
  the request queue and the response queue. The Copier waits for a request to be pushed to the request queue,
  processes it and sends back the request through the response queue. In the current implementation, the Copier
  simply copies the requested file from the local filesystem to a shared directory (determined by
  :func:`~lightning.app.storage.path.shared_storage_path`). Any errors raised during the copy will be added to the
  response and get re-raised within the corresponding LightningWork.
  
  Args:
      copy_request_queue: A queue connecting the central StorageOrchestrator with the Copier. The orchestrator
          will send requests to this queue.
      copy_response_queue: A queue connecting the central StorageOrchestrator with the Copier. The Copier
          will send a response to this queue whenever a requested copy has finished.
class_docstr_tok: ["The","Copier","is","a","thread","running","alongside","a","LightningWork",".","It","maintains","two","queues","that","connect","to","the","central",":","class",":","`","~lightning.app.storage.orchestrator.StorageOrchestrator","`",",","the","request","queue","and","the","response","queue",".","The","Copier","waits","for","a","request","to","be","pushed","to","the","request","queue",",","processes","it","and","sends","back","the","request","through","the","response","queue",".","In","the","current","implementation",",","the","Copier","simply","copies","the","requested","file","from","the","local","filesystem","to","a","shared","directory","(","determined","by",":","func",":","`","~lightning.app.storage.path.shared_storage_path","`",")",".","Any","errors","raised","during","the","copy","will","be","added","to","the","response","and","get","re-raised","within","the","corresponding","LightningWork",".","Args",":","copy_request_queue",":","A","queue","connecting","the","central","StorageOrchestrator","with","the","Copier",".","The","orchestrator","will","send","requests","to","this","queue",".","copy_response_queue",":","A","queue","connecting","the","central","StorageOrchestrator","with","the","Copier",".","The","Copier","will","send","a","response","to","this","queue","whenever","a","requested","copy","has","finished","."]
code: def join(self, timeout: Optional[float] = None) -> None:
      self._exit_event.set()
      super().join(timeout)
  
file_path: pytorch-lightning/src/lightning/app/storage/copier.py
imports: import concurrent.futures
  import pathlib
  import threading
  from threading import Thread
  from time import time
  from typing import TYPE_CHECKING, Optional, Union
  from fsspec import AbstractFileSystem
  from fsspec.implementations.local import LocalFileSystem
  from lightning.app.core.queues import BaseQueue
  from lightning.app.storage.path import _filesystem
  from lightning.app.storage.requests import _ExistsRequest, _GetRequest
  from lightning.app.utilities.app_helpers import Logger
label_desc: Use image node_id 3 for calling the _Copier obj's underlying member method code with example usage: obj.join(timeout) without return types