Process Array Example ^^^^^^^^^^^^^^^^^^^^^ .. code-block:: bash # This module shows the basic pattern for running an array of # parallel tasks. array_writer_define_opts loops over a fixed set # of task identifiers and calls save_opt_list once per iteration, # so DeBasher schedules one array_writer task per call with its own # "-id" and "-outf" options. array_reader_define_opts mirrors the # same loop, reading each writer task's output through # define_opt_from_proc_task_out. The loop itself is written by hand # here: compare it with the following example, where the same # scenario is expressed through DeBasher's array option handler # convention instead. array_writer_document() { document_process "Executes an array of 4 tasks. Each task creates a file containing the task index." } array_writer_explain_opts() { # -c option local description="Sleep time in seconds" explain_opt "-c" "" "$description" # -id option local description="id of writer" explain_opt "-id" "" "$description" # -outf option local description="output file of writer" explain_opt "-outf" "" "$description" } array_writer_identify_cmdline_opts() { opt_is_cmdline "-c" } array_writer_define_opts() { # Initialize variables local cmdline=$1 local process_spec=$2 local process_name=$3 local process_outdir=$4 local optlist="" # -c option define_cmdline_opt "$cmdline" "-c" optlist || return 1 # Save option list so as to execute process four times for id in 0 1 2 3; do local specific_optlist=${optlist} define_opt "-id" $id specific_optlist || return 1 define_opt "-outf" "${process_outdir}/${id}" specific_optlist || return 1 save_opt_list specific_optlist done } array_writer() { # Initialize variables local sleep_time=$(read_opt_value_from_func_args "-c" "$@") local id=$(read_opt_value_from_func_args "-id" "$@") local outf=$(read_opt_value_from_func_args "-outf" "$@") # Sleep some time sleep ${sleep_time} # Create file echo $id > "${outf}" } array_writer_reset_outfiles() { # Initialize variables local outf=$(read_opt_value_from_func_args "-outf" "$@") # Remove output file if [ -f "${outf}" ]; then rm "${outf}" fi } array_reader_document() { document_process "Reads each array_writer task's output file and copies its content to the reader's own output file." } array_reader_explain_opts() { # -id option local description="id of reader" explain_opt "-id" "" "$description" # -infile option local description="input file" explain_opt "-infile" "" "$description" # -outdir option local description="output directory of reader" explain_opt "-outdir" "" "$description" } array_reader_identify_cmdline_opts() { : } array_reader_define_opts() { # Initialize variables local cmdline=$1 local process_spec=$2 local process_name=$3 local process_outdir=$4 local optlist="" # Save option list so as to execute process four times for id in 0 1 2 3; do local specific_optlist=${optlist} define_opt "-id" $id specific_optlist || return 1 define_opt_from_proc_task_out "-infile" "array_writer" "${id}" "-outf" specific_optlist || return 1 define_opt "-outdir" "${process_outdir}" specific_optlist || return 1 save_opt_list specific_optlist done } array_reader() { # Initialize variables local id=$(read_opt_value_from_func_args "-id" "$@") local infile=$(read_opt_value_from_func_args "-infile" "$@") local outd=$(read_opt_value_from_func_args "-outdir" "$@") # Copy content of infile to auxiliary file cat "${infile}" > "${outd}"/${id}_aux # Copy content of infile to final file cat "${outd}"/${id}_aux > "${outd}"/${id} } array_reader_post() { logmsg "Cleaning directory..." # Initialize variables local id=$(read_opt_value_from_func_args "-id" "$@") local outd=$(read_opt_value_from_func_args "-outdir" "$@") # Remove auxiliary file rm "${outd}"/${id}_aux logmsg "Cleaning finished" } debasher_array_example_original_program() { add_debasher_process "array_writer" "cpus=1 mem=32 time=00:01:00,00:02:00 throttle=2" add_debasher_process "array_reader" "cpus=1 mem=32 time=00:01:00 throttle=4" }