docs: def stack_pages(pages, out=None, maxworkers=None, **kwargs):
      """Read data from sequence of TiffPage and stack them vertically.
  
      Additional parameters are passsed to the TiffPage.asarray function.
  
      """
      npages = len(pages)
      if npages == 0:
          raise ValueError('no pages')
  
      if npages == 1:
          kwargs['maxworkers'] = maxworkers
          return pages[0].asarray(out=out, **kwargs)
  
      page0 = next(p for p in pages if p is not None).keyframe
      page0.asarray(validate=None)  # ThreadPoolExecutor swallows exceptions
      shape = (npages,) + page0.shape
      dtype = page0.dtype
      out = create_output(out, shape, dtype)
  
      if maxworkers is None:
          if page0.compression > 1:
              if page0.is_tiled:
                  maxworkers = 1
                  kwargs['maxworkers'] = 0
              else:
                  maxworkers = 0
          else:
              maxworkers = 1
      if maxworkers == 0:
          import multiprocessing  # noqa: delay import
          maxworkers = multiprocessing.cpu_count() // 2
      if maxworkers > 1:
          kwargs['maxworkers'] = 1
  
      page0.parent.filehandle.lock = maxworkers > 1
  
      filecache = OpenFileCache(size=max(4, maxworkers),
                                lock=page0.parent.filehandle.lock)
  
      def func(page, index, out=out, filecache=filecache, kwargs=kwargs):
          """Read, decode, and copy page data."""
          if page is not None:
              filecache.open(page.parent.filehandle)
              out[index] = page.asarray(lock=filecache.lock, reopen=False,
                                        validate=False, **kwargs)
              filecache.close(page.parent.filehandle)
  
      if maxworkers < 2:
          for i, page in enumerate(pages):
              func(page, i)
      else:
          # TODO: add exception handling
          with ThreadPoolExecutor(maxworkers) as executor:
              executor.map(func, pages, range(npages))
  
      filecache.clear()
      page0.parent.filehandle.lock = None
  
      return out