Простая параллельная обработка с xargs
Привет, я Муноу.
Извините за долгое отсутствие публикаций, но я жив.
Я купил подержанный Ryzen 5, и, к моему удивлению, у него были погнуты контакты, и распознавалась только одна планка памяти, среди прочих инцидентов, но я как-то справляюсь.
Я дешево купил еще одну материнскую плату AM4 формата M-ATX, так что думаю использовать этот чип Ryzen для сборки мини-ПК.
Удобный xargs
xargs - Wikipedia
Команда xargs, существующая как команда UNIX, очень удобна.
Сначала я не привык к ней, но чем больше я ее использую, тем больше универсальности нахожу. Это очень хорошая команда, которая даже устраняет необходимость писать простые циклы в одну строку.
Случай использования
Например, предположим, что у вас есть видео, которые вы хотите сохранить с помощью yt-dlp, и они перечислены по одной строке.
url1
url2
url3
Естественно, если передать все в единую пакетную параллельную обработку, нагрузка на процессор станет интенсивной, поэтому, если вы хотите запустить это по 2 процесса за раз, вы можете написать это следующим образом.
cat url-txt | xargs -I {} -P 2 yt-dlp {}
Удивительно, но с помощью этого вы можете обрабатывать по 2 процесса за раз.
Давайте разберем
Итак, как это работает?
Вышеизложенное эквивалентно следующему:
yt-dlp url1 ; yt-dlp url2
yt-dlp url3
Механически это означает, что команда, переданная xargs, выполняется каждый раз.
Это похоже на чтение строки с помощью read line и сохранение ее в виде массива?
Что если без опций?
Без опций все аргументы передаются сразу команде, заданной xargs.
Поскольку совместимые команды ограничены, мне кажется, лучше использовать опцию -I.
В таких случаях, как следующий:
cat url-txt | xargs yt-dlp
В этом случае была бы выполнена следующая команда:
yt-dlp url1 url2 url3
Поэтому, кажется, лучше обрабатывать с помощью -I, когда это возможно, но в некоторых ситуациях может быть нормально и без опций.
Случай использования 2
Это также полезно, когда вы хотите grep или sed только определенные имена файлов с помощью команды find.
find . -name "testfile" | xargs -I {} grep "return 0" {}
Таким образом, можно grep только определенные файлы с таким коротким описанием.
На сегодня все.
До новых встреч.