#!/usr/bin/python import multiprocessing import os import subprocess import sys import time def test_flacs(job_queue, result_queue): i = 0 for filename in iter(job_queue.get, None): p = subprocess.Popen(['flac', '--totally-silent', '--test', filename]) p.communicate() result_queue.put((filename, p.returncode == 0)) i += 1 if i >= 10: time.sleep(1) i = 0 def find_files(root): pathnames = set() for dirname, subdirs, filenames in os.walk(root): for pathname in [os.path.join(dirname, x) for x in filenames]: if pathname.endswith('.flac'): pathnames.add(pathname) return pathnames files = find_files(sys.argv[1]) job_queue = multiprocessing.Queue() result_queue = multiprocessing.Queue() for job in files: job_queue.put(job) for i in range(multiprocessing.cpu_count()): p = multiprocessing.Process(target=test_flacs, args=(job_queue, result_queue)) p.start() total = len(files) bad = list() for done in range(total): result = result_queue.get() sys.stderr.write('\r%d / %d done' % (done + 1, total)) sys.stderr.flush() if result: filename, ok = result if not ok: bad.append(filename) for i in range(multiprocessing.cpu_count()): job_queue.put(None) sys.stderr.write('\n') for filename in bad: print 'BAD:', filename