저는 10,000개의 코어가 있는 컴퓨터를 사용하고 있지만 한 번에 1,000개의 코어에만 액세스하도록 허용합니다.
여러 곳에서 GNU 병렬 처리의 이점을 활용하는 스크립트가 있습니다. 레벨 A를 병렬화하고 이 스크립트 내에서 30배 더 많은 작업을 수행합니다.
--link
병렬성과 구문을 사용하기 위해 전체 스크립트를 다시 작성하려면 많은 작업이 필요합니다 ::: A B C ::: $(seq 30)
.
parallel
두 개의 독립적 호출이 둘 사이의 총 작업 수를 1000개로 제한할 만큼 충분히 통신할 수 있는 방법이 있습니까 ?
답변1
제가 올바르게 이해했다면 귀하는 GNU Parallel을 2개(또는 그 이상) 인스턴스를 실행하고 총 실행 작업 수가 1000개 미만이기를 원한다는 것입니다.
따라서 어떤 시점에서는 그 중 하나가 300개의 작업을 실행하고 다른 하나는 700개의 작업으로 제한되어야 합니다.
--limit
이 특별한 경우를 위해 설계되었습니다. 선택한 스크립트를 실행하고 종료 값에 따라 작업 수를 제한합니다.
이제 실행 중인 총 작업 수를 결정하는 방법이 필요합니다.
어쩌면 뭔가요 [ $(ps aux | grep myprogram | wc -l) -gt 1000 ]
?
(어떤 괴물이 10,000개의 코어를 가지고 있나요?)
답변2
또 다른 해결책은 --sqlmaster/--sqlworker
.
1000초를 생성 --sqlworker
하고 실행할 작업을 데이터베이스에 넣습니다 --sqlmaster
.
master1$ seq 10000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.1{}
# The + is needed to append to existing table
master2$ seq 4000 | parallel --sqlmaster +pg://user:pass@server/db/table sleep 1.2{}
worker1..1000$ parallel --sqlworker +pg://user:pass@server/db/table
나는 이것이 버전에 덜 민감하다고 생각합니다 --limit
. 특히 단일 시스템이 아닌 클러스터에서 실행 중이기 때문입니다.