Squeak.ru - шаблоны программирования

Ленивая оценка Haskell в параллелизме

Если значение x находится в списке, где x — это некоторая функция, а parList вызывается в этом списке (например, [l,x,l,x]), вычисляется ли x один или два раза?

Насколько я понимаю ленивую оценку Haskell, после того, как x был оценен, его не нужно оценивать снова, поскольку он вернет то же значение. Но применимо ли это в многопоточной среде?


Ответы:


1

Всякий раз, когда вы создаете искру для вычисления (что и делает parList), всегда существует вероятность того, что работа для этого вычисления будет выполнена дважды. На практике это случается редко. В основном существует состояние гонки между потоками, обрабатывающими искры, и основным потоком.

Haskell реализует ленивость, изначально устанавливая значение переменной в thunk — по сути, указатель на код для вычисления значения. Когда требуется значение переменной, Haskell запускает код, на который указывает преобразователь, и заменяет преобразователь возвращаемым значением. Если переменная используется позже, Haskell просто использует сохраненное значение.

Когда вы оцениваете переменную параллельно, создается искра, указывающая на переменную. Когда искра обрабатывается фоновым потоком, она просто требует значение, на которое указывает искра. Если искра указывает на преобразователь, преобразователь запускается и обновляется возвращенным значением. Если искра указывает на уже вычисленное значение, ничего не происходит, и мы говорим, что искра затухла.

Таким образом, если вы оцениваете список, подобный [x,x,x,x,x,x], параллельно, для каждого элемента списка будет создана одна искра, и возможно, что две или более таких искр будут выполняться одновременно. Также возможно, что основной поток будет одновременно оценивать x. В этом случае работа по вычислению x будет дублироваться. Однако, как только преобразователь для x был обновлен, никакие искровые или основные оценки потока x, начинающиеся после этого, не будут пересчитывать x.

24.07.2016
  • Ура, у меня есть еще один уточняющий вопрос. Учтите, что у нас есть 2 искры достаточно большой длительности. Представьте, что первая искра обращается и вычисляет x, но не возвращает. Тем временем параллельно, но после этого расчета, второй искровой доступ x. Эта искра получает значение x из расчета первой искры или она сама вычисляет x? 25.07.2016
  • Если вычислению требуется значение x, а x в настоящее время является преобразователем, он выполнит работу по вычислению x, обновит x вычисленным значением (так что x больше не является преобразователем) и продолжит работу. 25.07.2016
  • Да, спасибо за это, но мой вопрос касается взаимодействия ленивых вычислений и искр. Я пытаюсь понять, становится ли оцененный преобразователь из одной искры доступным для другой искры, которая была запущена до того, как преобразователь был оценен. Скажем, у меня есть две искры S1 и S2, которые в настоящее время работают параллельно, и обе из них были переданы через преобразователь x изначально в момент времени t0. В момент времени t1, через некоторое время после запуска S1 и S2, S1 обращается к x, тем самым оценивая преобразователь. Предположим, что оценка преобразователя завершается в момент времени t2. В момент времени t3 (где t3 > t2) искра S2 обращается к x. 25.07.2016
  • Для ясности предположим, что S1 заканчивается в момент t4, где t4 > t3. Мой вопрос заключается в том, получает ли S2 значение x или выполняет преобразователь для получения значения x? Если он получает доступ к значению и не оценивает преобразователь, это наводит меня на мысль о классической модели многопоточности, в которой значения общих переменных видны одновременно всем потокам. Если нет, то это больше похоже на модель в стиле форка, в которой каждой искре присваивается инициализированное состояние, которое изолировано на время ее выполнения. Спасибо. 25.07.2016
  • Как только поток (включая искры) преобразует преобразователь в значение, оно становится видимым для всех других потоков/спарков. 25.07.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...