diff --git a/worlds/Files.py b/worlds/Files.py index ac1acbf32248..52d3c7da1d35 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -2,11 +2,18 @@ import json import zipfile +import os +import threading from typing import ClassVar, Dict, Tuple, Any, Optional, Union, BinaryIO import bsdiff4 +semaphore = threading.Semaphore(os.cpu_count() or 4) + +del threading +del os + class AutoPatchRegister(type): patch_types: ClassVar[Dict[str, AutoPatchRegister]] = {} @@ -57,11 +64,12 @@ def write(self, file: Optional[Union[str, BinaryIO]] = None) -> None: zip_file = file if file else self.path if not zip_file: raise FileNotFoundError(f"Cannot write {self.__class__.__name__} due to no path provided.") - with zipfile.ZipFile(zip_file, "w", self.compression_method, True, self.compression_level) \ - as zf: - if file: - self.path = zf.filename - self.write_contents(zf) + with semaphore: # TODO: remove semaphore once generate_output has a thread limit + with zipfile.ZipFile( + zip_file, "w", self.compression_method, True, self.compression_level) as zf: + if file: + self.path = zf.filename + self.write_contents(zf) def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: manifest = self.get_manifest()