Create mash files for multiple fasta files
    Input:
        fastas <list[str]>  -- paths to fasta files
        mash_file <str>     -- path to output mash file
        threads <int>       -- # threads for parallelization
        kmer <int>          -- kmer size for mash sketching
        force <boolean>     -- force overwrite of all mash files

def make_mashes(fastas, mash_file, threads, kmer = 21, force = False):
    """
    Create mash files for multiple fasta files
    Input:
        fastas <list[str]>  -- paths to fasta files
        mash_file <str>     -- path to output mash file
        threads <int>       -- # threads for parallelization
        kmer <int>          -- kmer size for mash sketching
        force <boolean>     -- force overwrite of all mash files
    """
    mash_processes = set()
    sketches = [fasta + '.msh' for fasta in fastas]
    devnull = open(os.devnull, 'w')
    # Perform the sketching
    for fasta, sketch in zip(fastas, sketches):
        if os.path.isfile(sketch):
            continue
        mash_cmd = ['/opt/bin/bio/mash', 'sketch', '-o', fasta, '-k', str(kmer), fasta]
        mash_processes.add(subprocess.Popen(mash_cmd, stderr=devnull))
        if len(mash_processes) >= threads:
            os.wait()
            mash_processes.difference_update([mp for mp in mash_processes if mp.poll() is not None])
    # Collect stragglers
    for mp in mash_processes:
        if mp.poll() is None:
            mp.wait()
    # Paste sketches into single mash
    paste_mashes(sketches, mash_file, force = force)
    return