GNU Parallel: как предотвратить параллельное выполнение определенных заданий - PullRequest
1 голос
/ 30 апреля 2019

GIVEN :

Параллельно выполняемых заданий: {app0, app1, app2, ....}

ВОПРОС :

Как можно запустить инструмент 'Параллельный GNU' для параллельного запуска всех заданий, в результате чего некоторые конкретные задания не могут выполняться одновременно?

ПРИМЕР :

Если appX и appY полагаются на одни и те же ресурсы, как можно указать, что appX может работать параллельно с app0, app1, ..но никогда с appY?

ПРИМЕР 2 :

appX и appY могут работать параллельно, но ни один из них не должен работать одновременно сappZ.

1 Ответ

2 голосов
/ 30 апреля 2019

Мне не на 100% ясно, что вы хотите. Может быть, заменить appX и appY на:

sem --id myidXY --fg appX
sem --id myidXY --fg appY

Что можно сделать так:

... | parallel eval '{= s/(app(X|Y))/sem --id appXY --fg $1/ =}'

Это должно убедиться, что работает только один appX или appY; но пусть побежит appZ s.

{= =} интерпретируется как код Perl.

s/(app(X|Y))/sem --id appXY --fg $1/ заменяет appX или appY на sem --id appXY --fg, за которым следует либо appX или appY в зависимости от того, что было найдено. Если ничего не найдено, значение не изменяется.

(echo appX; echo appX; echo appX; 
 echo appY; echo appX; echo appV;
 echo appX; echo appZ) |
  parallel eval '{= s/(app(X|Y))/sem --id appXY $1/ =}'

Если вы не это имеете в виду, отредактируйте вопрос.

...