Хобрук: Ваш путь к мастерству в программировании

Почему @NonCPS необходим при переборе списка?

У меня есть следующий код Groovy:

// @NonCPS
def printList(params) {
    def jobs = [:]
    println params
    params.split(",").each { param ->
        println "Param: ${param}"
    }
}
text = "Foo,Bar,Baz,Qux"
printList(text)

который работает, как и ожидалось, при вызове из команды groovy:

$ groovy test.groovy 
Foo,Bar,Baz,Qux
Param: Foo
Param: Bar
Param: Baz
Param: Qux

Хотя при тестировании в рамках задания без песочницы в Jenkins у меня разные результаты:

[Pipeline] echo
Foo,Bar,Baz,Qux
[Pipeline] echo
Param: Foo
[Pipeline] End of Pipeline

Проблема в том, что печатается только первый элемент, а не все.

Однако код работает должным образом в Jenkins только при использовании вспомогательного метода @NonCPS.

Почему @NonCPS необходимо для правильного перебора списка элементов? И есть ли обходной путь без использования @NonCPS (особенно в изолированной среде)?


  • Я не буду пытаться объяснить вам прямо сейчас, что CPS работает в конвейере, его реализация все еще немного волшебна / непредсказуема для меня и не имеет отношения к этому вопросу. Тем не менее, я могу сказать, что поведение пайплайна без песочницы сильно отличается от версии того же скрипта в песочнице. Скорее всего, проблемы с реализацией, как мне кажется. Конвейер Jenkins все еще находится в стадии активной разработки. Кстати, опция «отключить песочницу» недоступна для скриптов из SCM по понятным причинам. 23.10.2016
  • Я предлагаю вам сосредоточиться на изолированном режиме, решая проблемы и ограничения, которые он имеет, по мере их появления. Это основной режим для конвейера 23.10.2016

Ответы:


1

Насколько я понимаю, как CPS работает и реализуется в целом, и как это обрабатывается конвейер (до сих пор не погружался в его код), конвейер пытается проверить способность приостанавливать (резервное копирование/..передача../восстановление) состояние выполнения (JVM) в большинстве инструкций кода через интерфейс сериализации. Учитывая, что это JVM ‹ groovy ‹ Pipeline DSL… это требует больших усилий для реализации разработчиками плагинов.

Далее, не будучи гуру Groovy или Java, насколько я могу думать о его реализации, генераторы groovy (например, { f -> print f } ) очень похожи на генераторы в python (выход) или генераторы C/C++ (функторные объекты).

Пока что они не могут быть легко сериализованы конвейером, пока итерируемый предметный итератор (например, индекс списка или состояние выражения yield) неявны. Таким образом, предпочтение циклов в стиле Java.

Циклы в альтернативном стиле Java (классический C) гораздо проще обрабатывать, если область выполнения явно содержит итератор цикла (индексная переменная 'i').

Пожалуйста, не считайте это авторитетным ответом, это всего лишь мое личное понимание CPS конвейера.

23.10.2016

2

Вы также можете использовать другие методы, чтобы получить тот же эффект. Например, следующее является сериализуемым и не требует, чтобы @NonCPS перебирал список с именем mylist:

for(int i=0; i < mylist.size(); i++) {
  println mylist[i]
}
24.10.2016
Новые материалы

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

Математика и интуиция - Часть 1
У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..

Как реализовать линейную регрессию в JavaScript
Узнайте, как реализовать линейную регрессию в JavaScript с помощью ML.js Линейная регрессия — это метод машинного обучения, используемый для моделирования связи между зависимой переменной и..