Паралелно изпълнение в bash

Блог за Linux, Bash и други информационни технологии

изпълнение
В повечето черупки командите се изпълняват последователно по подразбиране. И това по принцип е нормално. Тъй като човек взаимодейства със системата последователно, обикновено няма нужда да изпълнява няколко команди паралелно. Bash не е изключение в това отношение. Но когато се автоматизира, възможността за паралелно изпълнение може да бъде полезна. Нека да видим как да организираме паралелно изпълнение в bash.

Използване на фона

За да се организира паралелната работа на няколко програми, той често се използва за стартиране във фонов режим, като се използва знакът амперсанд - &. Например:

Командата ще се изпълнява във фонов режим и командите могат да се изпълняват от текущата обвивка. По този начин вече е възможно да се паралелизират някои действия. Можете да изпълните няколко команди наведнъж по този начин и да изчакате, докато всички те работят. Командата за изчакване се използва за изчакване за стартиране на дъщерни процеси. Тази команда, без параметри, чака всички дочерни процеси да завършат, така че за да изчакате 5 процеса да завършат, ще трябва да изпълните командата само 1 път. По принцип това лесно става чрез цикъл. Например по този начин:

И резултатът от този скрипт:

Както можете да видите, на пръв поглед идентични команди, изпълнени в различен ред, отколкото ние ги изпълнихме. Нека видим сега общото време за изпълнение на скрипта.

Общото време за изпълнение на скрипта е малко повече от 10 секунди, което доказва, че нашите команди са били изпълнявани паралелно, а увеличаването на времето за изпълнение показва, че те не са стартирани по едно и също време, между стартирането е имало малки таймаути. Но те бяха много малки, така че стартирането на пет подобни процеса отнема почти същото време като стартирането на един.

Използване на тръбата

Когато се използват тръби, които пренасочват изхода на една програма към входа на друга, процесите се изпълняват паралелно. Това предполага друг начин за паралелно изпълнение на няколко команди - за пренасочване на някои данни между тях с помощта на тръба. Например:

Тук е важно да запомните това: ако наистина не е необходимо да прехвърляте никакви данни между програмите, първо трябва да се уверите, че тези програми получават входни данни под формата на опции на командния ред и няма да използват данните, които са били прехвърлени в ги с помощта на тръбата. Въпреки че тук по принцип е възможна следната опция:

Преди да го използвате в скриптове, разбира се, трябва непременно да го проверите в ръчен режим и да разгледате страниците с ръководството на използваните програми (ако има такава информация), което има по-висок приоритет - опции на командния ред или стандартен вход, защото някои програмите могат да игнорират командния низ, ако данните се предават на стандартен входен поток.

Паралелно изпълнение и ограничаване на броя на фоновите задачи в скрипта

Нека разгледаме такава практическа задача - да изпълняваме 100 процеса паралелно, но така, че да не се изпълняват едновременно повече от 10 процеса. Като цяло, доста проста задача. Да предположим, че всички процеси се изпълняват за произволен период от време. Нека стартирането на една задача да изглежда като стартиране на командата за заспиване с произволен параметър от 0 до 29. Тогава скриптът ще изглежда така:

Смисълът на този скрипт като цяло е следният: ограничаваме максималния брой фонови дъщерни процеси, така че да не са повече от 10 едновременно. Веднага след като един процес приключи работата си, започваме следващия. И така, докато изпълним 100 фонови задачи. За поръчка проследяваме в скрипта края на работата на дъщерните процеси след стартирането на последния, едва тогава завършваме работата на самия скрипт.

По този прост начин можете да ограничите броя на едновременно изпълняваните фонови задачи в скрипта и в същото време да следите колко от тях се изпълняват в момента. За да стане по-ясно, стартирайте скрипта и вижте кога започват следващите итерации на цикъла и кога се променя броят на дъщерните процеси.