Você pode usar a biblioteca python concurrent
, que é projetada para processar uma fila de solicitações entre todos ou alguns segmentos, comendo a fila até que todos os trabalhos sejam executados inteiramente.
- Gerar uma lista grande de arquivos, como
[ [f0..f0-1], [fn..f2n-1]..]
- Use um
ThreadPoolExecutor
para comer essa lista com todos muitos thread seu computador tem. Isso pode ser assim:
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]))