GNU Parallel은 내 기능에서 모든 명령을 동시에 실행합니다.

GNU Parallel은 내 기능에서 모든 명령을 동시에 실행합니다.

좋아, 여러 폴더에 적용되는 bash 기능이 있습니다.

function task(){
do_thing1
do_thing2
do_thing3
...
}

이 기능을 병렬로 실행하고 싶습니다. 지금까지 나는 약간의 포크 트릭을 사용하고 있습니다.

N=4 #core number
for temp_subj in ${raw_dir}/MRST*
do
  ((i=i%N)); ((i++==0)) && wait
  task "$temp_subj" &
done

그리고 그것은 훌륭하게 작동합니다. 그러나 나는 "더 깔끔한" 것을 선택하고 GNU Parallel을 사용하기로 결정했습니다.

ls -d ${raw_dir}/MRST* | parallel task {}

문제는 내 작업 함수의 do_thing을 포함하여 모든 것을 병렬로 배치한다는 것입니다. 순차적으로 실행해야 하기 때문에 필연적으로 충돌이 발생합니다. 다양한 방법으로 병렬 호출을 수정해 보았지만 아무것도 작동하지 않는 것 같습니다. 어떤 아이디어가 있나요?

답변1

귀하의 문제는 다음과 관련이 있다고 생각합니다 do_thingX.

do_thing() { echo Doing "$@"; sleep 1; echo Did "$@"; }
export -f do_thing
do_thing1() { do_thing 1 "$@"; }
do_thing2() { do_thing 2 "$@"; }
do_thing3() { do_thing 3 "$@"; }
# Yes you can name functions ... - it is a bit unconventional, but it works
...() { do_thing ... "$@"; }
export -f do_thing1
export -f do_thing2
export -f do_thing3
export -f ...

function task(){
  do_thing1
  do_thing2
  do_thing3
  ...
}
export -f task
# This should take 4 seconds for a single input
ls ${raw_dir}/MRST* | time parallel task {}

아니면 GNU Parallel을 사용하고 있지 않습니다 parallel. GNU와 병렬인지 확인하십시오.

$ parallel --version
GNU parallel 20201122
Copyright (C) 2007-2020 Ole Tange, http://ole.tange.dk and Free Software
Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
GNU parallel comes with no warranty.

Web site: https://www.gnu.org/software/parallel

When using programs that use GNU Parallel to process data for publication
please cite as described in 'parallel --citation'.

관련 정보