xargs "병렬 프로세서"의 색인을 얻는 방법은 무엇입니까?

xargs "병렬 프로세서"의 색인을 얻는 방법은 무엇입니까?

독점적으로 액세스할 수 있는 0및 라는 두 개의 리소스가 있다고 가정해 보겠습니다 .1

xargs시작된 "병렬 프로세서"의 "인덱스"를 복원하여 무료 뮤텍스 서비스로 사용할 수 있는 방법이 있습니까 ? 예를 들어 다음 병렬 계산을 고려해보세요.

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {}"
consuming task 1
consuming task 2
consuming task 3
consuming task 4
consuming task 5
consuming task 6
consuming task 7
consuming task 8

내 질문은 마법의 단어가 있으면 index출력은 다음과 같습니다.

$ echo {1..8} | xargs -d " " -P 2 -I {} echo "consuming task {} with resource index"
consuming task 1 with resource 0
consuming task 2 with resource 1
consuming task 3 with resource 1
consuming task 4 with resource 1
consuming task 5 with resource 0
consuming task 6 with resource 1
consuming task 7 with resource 0
consuming task 8 with resource 0

유일한 보장은 최대 하나의 프로세스가 에 0대한 리소스를 사용한다는 것입니다 1. 기본적으로 저는 이 인덱스를 자식 프로세스에 전달하고 싶습니다. 자식 프로세스는 표시된 리소스만 사용한다는 규칙을 따릅니다.

물론 이를 두 개 이상의 리소스로 확장하는 것이 좋습니다. 문서를 확인해보면 xargs불가능할 수도 있습니다. 최소한으로 동등한 솔루션이 있습니까? 파일을 가짜 잠금 장치로 사용/정리하는 것은 바람직하지 않습니다.

답변1

당신이 사용하는 경우GNU xargs, 가지다 --process-slot-var:

--process-slot-var=환경 변수 이름
환경 변수 설정환경 변수 이름실행 중인 각 하위 프로세스에는 고유한 값이 있습니다. 각 값은 10진수 정수입니다. 하위 프로세스가 종료되면 값이 재사용됩니다. 예를 들어 이는 기본 부하 분산 시나리오에 사용될 수 있습니다.

예를 들면 다음과 같습니다.

~ echo {1..9} | xargs -n2 -P2 --process-slot-var=index sh -c 'echo "$index" "$@" "$$"' _
0 1 2 10475
1 3 4 10476
1 5 6 10477
0 7 8 10478
1 9 10479

답변2

@muru의 답변이 마음에 들지만 _마지막 답변이 매우 중요하다는 점에 유의하세요! 이는 명령 매개변수 뒤의 매개변수와 up ( 스크립트 이름과 동일) $@만 포함되기 때문입니다 . 이것이 없으면 xargs에 대한 n개의 입력 중 하나가 누락됩니다. 이 문제에 걸려서 여기에 게시했습니다.$1sh -c$0

다른 곳에서 그런 문제 없이 더 쉽게 처리할 수 있는 GNU 병렬성에 대한 언급을 본 적이 있습니다. (코멘트할 카르마가 없기 때문에 새로운 답변으로 게시되었습니다).

관련 정보