Sie können eine Python- concurrent
Bibliothek verwenden, die eine Anforderungswarteschlange zwischen allen oder einigen Threads verarbeitet und die Warteschlange so lange frisst, bis alle Jobs vollständig ausgeführt sind.
- Erstellen Sie eine große Liste mit Dateien, z. B.
[ [f0..f0-1], [fn..f2n-1]..]
- Verwenden Sie a
ThreadPoolExecutor
, um diese Liste mit allen Fäden Ihres Computers zu essen. Das kann so aussehen:
import os import sys from concurrent.futures import ThreadPoolExecutor import subprocess import itertools import math def main(p, num_tar_files): files = list(split_files_in(p, num_tar_files)) tar_up = tar_up_fn(p) with ThreadPoolExecutor(len(files)) as executor: archives = list(executor.map(tar_up, itertools.count(), files)) print("\n {} archives generated".format(len(archives))) def split_files_in(p, num_slices): files = sorted(os.listdir(p)) N = len(files) T = int(math.ceil(N / num_slices)) # means last .tar might contain <T files for i in range(0, N, T): yield files[i:i+T] def tar_up_fn(p): def tar_up(i, files): _, dir_name = os.path.split(p) tar_file_name = "{}_{:05d}.tar".format(dir_name, i) print('Tarring {}'.format(tar_file_name)) subprocess.call(["tar", "-cf", tar_file_name] + files, cwd=p) return tar_file_name return tar_up if __name__ == '__main__': main(sys.argv[1], int(sys.argv[2]))