2016-07-24 3 views
3

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

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

ответ

6

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

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

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

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

+0

Привет, У меня есть еще один следующий вопрос. Рассмотрим, что у нас есть 2 достаточно длительных периода искры. Представьте, что первая искра открывает и вычисляет 'x', но не возвращает. Между тем в параллель, но после этого расчета, второй доступ к искрам «х». Эта искра получает значение 'x' от вычисления первой искры или сама вычисляет' x'? –

+0

Если для вычисления требуется значение 'x' и' x' в настоящее время является thunk, он будет выполнять работу по вычислению 'x', update' x' с вычисленным значением (так что 'x' больше не является thunk) и продолжить. – ErikR

+0

Да, спасибо за это, но мой вопрос касается взаимодействия ленивой оценки и искр. Я пытаюсь понять, может ли оцененный удар от одной искры стать доступной для другой искры, которая была начата до того, как удар был оценен. Скажем, у меня есть два искры S1 и S2, которые в настоящее время работают параллельно, и оба из них были переданы thunk to x изначально в момент времени t0. В момент времени t1, через некоторое время после запуска S1 и S2, S1 получает доступ к x, тем самым оценивая thunk.Предположим, что оценка момента была завершена в момент времени t2. В момент времени t3 (где t3> t2) искра S2 обращается к x. –

Смежные вопросы