def parallel_run_these(G, list_of_targets, in_mem_shas, from_store,<EOL>settings, dont_update_shas_of):
verbose = settings["<STR_LIT>"]<EOL>quiet = settings["<STR_LIT>"]<EOL>error = settings["<STR_LIT:error>"]<EOL>sprint = settings["<STR_LIT>"]<EOL>if len(list_of_targets) == <NUM_LIT:1>:<EOL><INDENT>target = list_of_targets[<NUM_LIT:0>]<EOL>sprint("<STR_LIT>".format(target),<EOL>level="<STR_LIT>")<EOL>run_the_target(G, target, settings)<EOL>node_dict = get_the_node_dict(G, target)<EOL>if "<STR_LIT>" in node_dict:<EOL><INDENT>for output in acts.get_all_outputs(node_dict):<EOL><INDENT>if output not in dont_update_shas_of:<EOL><INDENT>in_mem_shas['<STR_LIT>'][output] = {"<STR_LIT>": get_sha(output,<EOL>settings)}<EOL>in_mem_shas[output] = get_sha(output, settings)<EOL>write_shas_to_shastore(in_mem_shas)<EOL><DEDENT><DEDENT><DEDENT>if "<STR_LIT>" in node_dict:<EOL><INDENT>for dep in acts.get_all_dependencies(node_dict):<EOL><INDENT>if dep not in dont_update_shas_of:<EOL><INDENT>in_mem_shas['<STR_LIT>'][dep] = {"<STR_LIT>": get_sha(dep, settings)}<EOL>write_shas_to_shastore(in_mem_shas)<EOL><DEDENT><DEDENT><DEDENT>return True<EOL><DEDENT>a_failure_occurred = False<EOL>out = "<STR_LIT>"<EOL>sprint(out.format("<STR_LIT:U+002CU+0020>".join(list_of_targets)))<EOL>info = [(target, get_the_node_dict(G, target))<EOL>for target in list_of_targets]<EOL>commands = [item[<NUM_LIT:1>]['<STR_LIT>'].rstrip() for item in info]<EOL>if not quiet:<EOL><INDENT>procs = [Popen(command, shell=True) for command in commands]<EOL><DEDENT>else:<EOL><INDENT>procs = [Popen(command, shell=True, stdout=PIPE, stderr=PIPE)<EOL>for command in commands]<EOL><DEDENT>for index, process in enumerate(procs):<EOL><INDENT>if process.wait():<EOL><INDENT>error("<STR_LIT>".format(info[index][<NUM_LIT:0>]))<EOL>a_failure_occurred = True<EOL><DEDENT>else:<EOL><INDENT>if "<STR_LIT>" in info[index][<NUM_LIT:1>]:<EOL><INDENT>for output in acts.get_all_outputs(info[index][<NUM_LIT:1>]):<EOL><INDENT>if output not in dont_update_shas_of:<EOL><INDENT>in_mem_shas['<STR_LIT>'][output] = {"<STR_LIT>": get_sha(output,<EOL>settings)}<EOL>write_shas_to_shastore(in_mem_shas)<EOL><DEDENT><DEDENT><DEDENT>if "<STR_LIT>" in info[index][<NUM_LIT:1>]:<EOL><INDENT>for dep in acts.get_all_dependencies(info[index][<NUM_LIT:1>]):<EOL><INDENT>if dep not in dont_update_shas_of:<EOL><INDENT>in_mem_shas['<STR_LIT>'][dep] = {"<STR_LIT>": get_sha(dep, settings)}<EOL>write_shas_to_shastore(in_mem_shas)<EOL><DEDENT><DEDENT><DEDENT><DEDENT><DEDENT>if a_failure_occurred:<EOL><INDENT>error("<STR_LIT>")<EOL>sys.exit(<NUM_LIT:1>)<EOL><DEDENT>return True<EOL>
The parallel equivalent of "run_this_target()"
It receives a list of targets to execute in parallel.
Unlike "run_this_target()" it has to update the shas
(in memory and in the store) within the function.
This is because one of the targets may fail but many can
succeed, and those outputs need to be updated

Args:
    G
    A graph
    A list of targets that we need to build in parallel
    The dictionary containing the in-memory sha store
    The dictionary containing the contents of the .shastore file
    The settings dictionary
    A list of outputs to not update shas of