LINUX.ORG.RU

GNU Parallel 20181222 ('Jacob Sparre')

 , , , ,


1

2

GNU Parallel — это инструмент командной оболочки, созданный Оле Танге. Написан на языке Perl, предназначен для выполнения задач параллельно на одном или нескольких компьютерах. Задача может быть однострочником или небольшим скриптом, который должен выполниться для каждой строки ввода. Примеры такого ввода — списки файлов, хостов, пользователей, ссылок или таблиц. Задачей также может быть команда, читающая из пайпа. GNU Parallel может разделять ввод и перенаправлять его выполняющимся параллельно командам.

Если вы уже пользуетесь xargs и tee — использовать GNU Parallel будет очень просто, так как он совместим с аргументами xargs. Если вы пишете циклы в командной оболочке, то обнаружите, что GNU Parallel может заменить большинство циклов и ускорить их за счёт распараллеливания. GNU Parallel может заменять даже вложенные циклы.

GNU Parallel гарантирует, что вывод команд получается таким же, каким был бы при последовательном запуске. Это позволяет использовать вывод GNU Parallel в качестве ввода для других программ.

Новое в этом выпуске:

>>> Получите книжку: GNU Parallel 2018

>>> Источник

Ответ на: комментарий от anonymous

Я писал профессионально наверное на десятке языков (включая эти ваши пистоны, жёваскрипты и прочем шлаке для низкосортных «разработчиков»). И считаю что Perl подходит для этого прекрасно. И вполне себе стандарт после bash-а. Если нужно что-то сложнее, что не очень гладко ложится на баш/awk/sed, - берётся Perl, который есть практически в любом дистрибутиве, почти как bash, а выразительно что-то записать - вообще не проблема (писать однострочные баш-команды на python, да с его-то оверхедом на скорость запуска и поедание рамы, - это просто моветон, я уж не говорю о том, что какая-нибудь лямбда функция + вывод на экран - уже сами по себе займут всю строку, елементарно, попробуйте записать

echo foo bar baz | perl -pe 's/foo/bar/'
на python-е, вместо perl-а, аналогично чтоб одной командой? В этом примере в вакууме конечно и sed-а хватит с головой, но чисто ради эксперимента)

anonymous ()
Ответ на: комментарий от anonymous

Мальчик, ты бы хотя бы бенчмарков нам набросал, а то юный и неопытный совсем, даже не проверил скорость запуска пистона и перла, и сколько там рамы на старте уже нет сразу, пока ещё ничего сделать даже не успели. А уж когда большое приложение работать начинает, так для JS и Python планки не успевают докупать. Вот тебе примерчик домашних замеров:

  • perl -E 'say "foo" while 1'
    — 508КиБ
  • python2 -c 'while True: print("foo")'
    — 2.5МиБ
  • python3 -c 'while True: print("foo")'
    — 3.6МиБ
  • node -e 'while (1) {console.log("foo")}'
    — В секунду течёт где-то по 100МиБ, за несколько секунд дошло до 1ГиБ и я решил убить процесс, этого достаточно (node --version = 8.12.0)

А вот когда речь идёт о настоящих проектах, а не песочных, об обработке больших данных, - тут прямо геометрическая прогрессия, CPython ест гигабайты, JS тоже (electron-приложениями давно пользовался? или чем-нибудь в браузере, где много данных перекладывается из одной кучи в другую?), - а Perl5 может в 10-20МиБ уложиться, представляешь, мой юный и неопытный друг?

anonymous ()
Ответ на: комментарий от actionless

Десятки тысяч. Только ты далеко-то не ходи, и анонам из интернета на верь. Возьми да сделай так:

parallel -j 1000 curl https://google.com \; \# {} ::: {1..1000}
И посмотри сколько рамы съест (у меня больше 14,8МиБ не поднималось).

anonymous ()
Ответ на: комментарий от anonymous

хорошо хоть не 14,88

твой «бенчмарк» даже до уровня techempower-овских недотягивает

посмотрел как бы ты запел если бы тебе нужно было самому поддерживать такую поделку на десятки тысяч строк лет трёх от роду хотя бы на каком нибудь дансере с версиями зависимостей которые уже давно вместe из спана не собираются (при условии что ты не был её автором, конечно :) )

actionless ★★★★★ ()
Последнее исправление: actionless (всего исправлений: 3)
Ответ на: комментарий от Moondancer

улучшено/упрощено не сильно мажорно звучит, но, может, новость просто неудачно составлена чтобы отобразить значимость этих изменений

но, серьезно, чем ты упоролся когда вписывал упоминания в блогах как пункты чэнджлога?

actionless ★★★★★ ()
Последнее исправление: actionless (всего исправлений: 1)

Кто-нибудь может привести внятный usecase этого ненужно?

А то выглядит прямо-таки изобретением велосипеда... ну то есть, ансибла/пуппета.

slamd64 ★★★★ ()
Ответ на: комментарий от actionless

Ну вот я несколько лет поддерживаю сложную систему на нескольких серваках с репликацией с количеством строк на perl, которые не рискнул пересчитать. И ничо, полёт нормальный.

solom ()
Ответ на: комментарий от slamd64

Опять смузи-девопсы лезут микроскопом гвозди заколачивать, да что ж такое. Цель сабжа, внезапно, просто параллелить задачи — брать stdin, раскидывать его по инстансам и в правильном порядке с них собирать stdout. То, что он ещё и по разным хостам их умеет раскидывать — это скорее бонус. Он не на админов таргетирован, а скорее на CS-ников и прочих учёных.

Moondancer ()
Ответ на: комментарий от t184256

Я вообще хз, зачем немецкий учить в школе (даже с учётом того, что многие релокатятся в Германию работать), он вне Европы нигде не распространён. У немцев и колоний-то толком не было почему-то. В США полно коренных немцев, но многие из них отреклись от своих корней и даже фамилии сменили, ибо WWI/WWII сделали немецкую национальность зашкварной.

Moondancer ()
Ответ на: комментарий от anonymous

Некоторые шизики пишут на баще целые программы, чеше всего одним фалом на несколько тыщ строк

я помню расчет зарплаты (со всякими подоходными и прочим маразмом) на bc. то, что это возможно, не делает это хорошим решением СЕГОДНЯ.

перл был, когда-то, неплохим языком, но время его, безвозвратно ,прошло и только упоротые с перлом головного мозга никак не хотят верить в реальность происходящего. они намертво прошили себе в мозг что означает $_, $| и тд и как обратиться ко вложенному елементу массива/хэша и прочие «тонкости» перла и возомнили себя властелинами мира. перл, если вовремя с него не свалить, напрочь убивал способность мыслить как-то по другому, поскольку требовал полной концентрации на своих «тонкостях».

перл мертв, потому что никто в здравом уме и твердой памяти не начинает на нем новых проектов. да на нем ничего, кроме мелочевки, и небыло никогда написано.

anonymous ()
Ответ на: комментарий от Moondancer

раскидывать его по инстансам и в правильном порядке с них собирать stdout

Ну это должны делать, как раз, всякие ансиблы с паппетами.

Что будет, если хосты на одну и ту же команду вернут разные данные в ответ? Ансибл или паппет это обработают, в конце-концов, можно в плейбуке/манифесте это предусмотреть.

А в этой поделке?

slamd64 ★★★★ ()
Ответ на: комментарий от actionless

Так ты мне что в пример альтернатив-то ставишь? JS с пехтоном? Да, у интерпретируемых языков с дин. типизацией куча проблем, но мы о них сейчас только и говорим, и конкуренты у Perl - говно.

anonymous ()
Ответ на: комментарий от anonymous

Ты не прав почти во всём. Я вот научился на перле писать спустя много лет как вообще кодить начал, языков 15-20 уже как было, включая как говноскрипты эти все и прочие пехтоны с похапе, так и haskell и си. Проекты на нём (перле) я видел, мягко говоря не маленькие, с усраться каким хайлоадом, на каком пехтон код какой-нибудь начинают в панике переписывать на go (т.к. всё падает от нехватки рамы и стоит колом от нагрузки на цпу), ну или «заваливают проблему деньгами» и закупают сразу несколько мощных серверов с кучей рамы и пытаются параллелить. А про мелочёвку, так вообще, интерпретируемые языки с динамической типизацией кроме как для мелочёвки и не предназначены by design. Никто в здравом уме по идее и не должен писать на жопьэс или пехтоне большой проект, равно как и на перле. А если мне нужно что-то автоматизировать, а баш оказывается не лучшим решением - я не задумываясь беру perl ($x->{foo}->{bar} делать научиться не сложно, если умственных дефектов нет), в то время как perl я изучил относительно недавно, а с пехтонами, жопьэсами и прочими похапе в своё время наелся гов^W собачатины.

anonymous ()
Ответ на: комментарий от actionless

Именно так, зависит от задачи.

Для большого проекта безусловно выбирается статическая типизация и компилируемый ЯП.

Если, по каким-то причинам, вдруг ставится выбор между php, js, python или perl - выбирается perl. Исключения бывают в случае самозамкнутой задачи. Например если стоит задача сделать server-side rendering для react.js приложения, это имеет смысл из-за общей кодовой базы.

anonymous ()
Ответ на: комментарий от anonymous

в маленьких проектах может быть важным богатство стандартной библиотеки, не очень то хочется тянуть фигню со всяких нпм на каждый чих (и как я говорил выше, это не только проблема безопасности, но проект может тупо не запуститься с нуля через пару лет)

actionless ★★★★★ ()
Ответ на: комментарий от anonymous

забыл упомянуть, что одна и та же либа с спана может по-раному работать с разными __минорыми__ версиями перла, это вообще жестяк:

под новый минорный релиз перла нужно подбирать новый «комплект» версий либ с спана, и молиться всем богам каких знаешь, чтобы они подошли друг к другу

actionless ★★★★★ ()
Последнее исправление: actionless (всего исправлений: 1)
Ответ на: комментарий от actionless

Ты конечно не поверишь, но в случае с python очень похожая ситуация, а в случае с js/php - полный елдак! Это тяжёлая болезнь всех сегодня существующих ЯП со слабой динамической типизацией.

Из всего что я видел, где это решено как-то примерно нормально - это Haskell + Stack (но отношение к сабжу(ам) это имеет посредственное), у Stack есть snapshot-ы, где все пакеты совместимы между собой (а совместимость гарантирована статической типизацией), а что не совместимо - просто не соберётся пока не поправишь, просто пробуешь собрать и фиксишь несовместимости, собралось - всё, починил. А не как в жёппоскрипте, когда тебе ночью звонят и говорят что 2 дня после релиза всё работало-работало, а потом всё наебнулось, и пол базы потёрло из-за рантайм-эксепшона, вызванного сломанным API в каком-нибудь underscore.js в минорном релизе.

anonymous ()
Ответ на: комментарий от anonymous

по поводу обратной совместимости внутри минорных версий, вроде, слегка получше, но даже если предположить, что одинаково — мой посыл был в том, что для маленьких проектов наличие широкой стандартной библиотеки позволяет избежать использования внешних либ

actionless ★★★★★ ()
Последнее исправление: actionless (всего исправлений: 2)

я пару раз его юзала. в целом - годнота. просто редко приходится писать какие-то задачи на скриптах. но для админов вещь весьма ценная.

Iron_Bug ★★★ ()
Ответ на: комментарий от slamd64

Да, может - обработка биоинформатических данных. Когда у тебя есть тонна данных, 60 ядер и однопоточная тулза, которая стандарт де-факто и которую всем лень переписывать. Можно и в ансибл это всё затолкать, но проще не умножать сущности и дописать строчку на баше с вызовом parallel. Потому как в следующий раз строчка на баше будет уже другой.

И да для раскидывания по хостам у всех знакомых на кластерах используется старый добрый PBS.

sometyx ()
Ответ на: комментарий от solom

используется какой-то фреймворк или «основные» библиотеки?

каким образом поддерживается список зависимостей?

недавно админил для команды поддерживающей средних размеров проект на дансере, опыт был так себе, и страшно представить если бы проект был крупным

actionless ★★★★★ ()