xargs 를 이용한 병렬 처리
라이브러리가 계속 확장됨에 따라 파일 처리 속도를 높이고 싶을 것입니다. 서로 독립적인 작업의 경우, 병렬로 실행하면 전체 실행 시간을 크게 단축할 수 있습니다. xargs의 -P 옵션을 사용하면 대상 명령어의 인스턴스를 여러 개 동시에 실행할 수 있으며, 이는 I/O 바운드 작업이나 대기 시간이 포함된 작업의 성능을 크게 향상시킵니다. 이것이 단순한 순차적 for 루프 처리와 비교했을 때 xargs가 갖는 핵심적인 장점입니다.
먼저, 도서 내용에 타임스탬프를 추가하고 지연 시간을 도입하여 도서 처리를 시뮬레이션하는 스크립트를 만들어 보겠습니다. 이 지연 시간은 병렬 실행을 시각적으로 확인하는 데 도움이 됩니다.
cat ~/project/process_book.sh
내용은 다음과 같습니다.
#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## 처리 시간을 시뮬레이션하기 위한 대기
이 스크립트는 다음을 수행합니다.
- 도서 제목을 인자 (
$1) 로 받습니다.
- 도서 제목 앞에 "processed_"가 붙은 새 파일을 생성합니다.
- 현재 날짜와 시간을 포함한 메시지를 이 파일에 기록합니다.
- 병렬 실행을 더 명확하게 확인할 수 있도록 2 초 동안 대기하며 처리 시간을 시뮬레이션합니다.
이제 -P 옵션과 함께 xargs를 사용하여 도서를 병렬로 처리해 보겠습니다. 또한 각 도서 제목을 스크립트의 인자로 전달하기 위해 다시 -I 옵션을 사용합니다.
cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}
이 명령어를 분석해 보겠습니다.
cat ~/project/more_books.txt: 도서 목록을 읽습니다.
|: 출력을 xargs로 보냅니다.
xargs -P 3: 최대 3 개의 프로세스를 병렬로 실행하도록 xargs에 지시합니다. xargs는 대상 명령어의 인스턴스를 동시에 최대 3 개까지 실행하며, 각 인스턴스는 하나 이상의 입력 항목을 처리합니다.
-I {}: 각 입력 항목에 대한 자리표시자로 {}를 정의하며, 이는 스크립트의 인자로 전달됩니다.
~/project/process_book.sh {}: 각 도서에 대해 실행할 명령어이며, {}는 도서 제목으로 교체됩니다.
이 명령어는 최대 3 권의 도서를 동시에 처리하기 시작합니다. 명령어를 실행한 후 처리된 파일의 내용을 확인할 수 있습니다.
cat ~/project/processed_*
도서들이 거의 동시에 또는 약간의 시간 차이를 두고 처리된 것을 보여주는 출력이 표시될 것이며, 이는 병렬 실행을 의미합니다. 정확한 시간은 다를 수 있지만 다음과 같이 표시될 수 있습니다.
Processing Pride_and_Prejudice at Mon Aug 12 10:15:01 UTC 2024
Processing The_Catcher_in_the_Rye at Mon Aug 12 10:15:01 UTC 2024
Processing The_Hobbit at Mon Aug 12 10:15:01 UTC 2024
Processing Animal_Farm at Mon Aug 12 10:15:03 UTC 2024
Processing Brave_New_World at Mon Aug 12 10:15:03 UTC 2024
처음 세 권의 도서가 같은 시간에 처리를 시작하고, 마지막 두 권은 약 2 초 후에 시작되는 것을 확인하십시오 (스크립트의 sleep 2 때문입니다). 이는 병렬 처리가 실제로 작동하고 있음을 보여주며, 독립적인 작업의 속도를 높이는 데 xargs를 사용하는 큰 이점입니다.