Size: a a a

2020 August 27

SK

Sergey Kapralov in JUG NN
Я не настаиваю на вложенных компутах на самом деле
источник

RM

Romian Makhline in JUG NN
то есть есть две мемоизируемые функции и ты не можешь заранее определить порядок исплнения?
источник

RM

Romian Makhline in JUG NN
они могут как запускаться последовательно, так и оверлапиться в любом порядке
источник

SK

Sergey Kapralov in JUG NN
Мне интересно, как бы это можно было писать так, чтоб не выглядело странно
источник

RM

Romian Makhline in JUG NN
в таком случае тебе нужно секьюрить внутри лямбды - локами или семафорами если все сложно прям внутри устроено
источник

SK

Sergey Kapralov in JUG NN
Romian Makhline
в таком случае тебе нужно секьюрить внутри лямбды - локами или семафорами если все сложно прям внутри устроено
Почему внутри? Наверное в месте где происходит инициализация кеша, нет?
источник

RM

Romian Makhline in JUG NN
если хочется без локов - тогда надо тянуть промежуточную абстракцию между функциями - это уже сложнее, опять же на вскидку - вместо кампута иф абсент - надо в обоих посчитать промежуточные результаты и упоковать их после выполнения ВТОРОЙ
источник

RM

Romian Makhline in JUG NN
Sergey Kapralov
Почему внутри? Наверное в месте где происходит инициализация кеша, нет?
тебе не обязательно все под лок вносить, полюбому есть просто критичные секции, а остальное может выполняться в любом порядке
источник

RM

Romian Makhline in JUG NN
вообще лично я бы попробовал строго определить порядок инициализации если это возможно, а если нет - чисто под общие реентранты фейрные запихал всю критику
источник

RM

Romian Makhline in JUG NN
если оч хочется без локов - дифф коллекциями построил сначала для первой, потом для второй лямбды и применил бы дифы уже в сингл поинт, но это сложно
источник

SK

Sergey Kapralov in JUG NN
Границы лямбд - считай уже границы секций. Вложенность compute if absentов даёт дедлок на бакетах конкаррентхешмапы. Причём репродьюсится даже на одном треде, лок не реентрант... Получается этот нереентрант лок мапы нужно обойти, для этого кеши для обоих лямбд должны инициализироваться отдельно друг от друга. Но при этом хотелось бы оставить возможность вкладывать лямбды друг в друга. А дальше, чето напрашивается кеширующий декоратор на каждой из лямбд, с даблчек локом, а-ля - посмотреть кеш, если ничего не закешированно, вычислить лямбду, положить в кеш результат, вернуть.

Такое в сыром виде практикуется? Конкарренси - не самая сильная моя сторона если честно.
источник

RM

Romian Makhline in JUG NN
ты слишком много хочешь, как мне кажется. у тебя есть две сущности борющиеся за один не конкурентный в данном случае ресурс. более того, они хотят его уметь захватывать и отпускать позже.
это неразрешимая проблема.
то есть если первая инициализация началась - мы смело можем сказать, что ресурс мапы взят, но не отпущен до тех пор, пока лямбда не выполниться. так как ты хочешь внутри этой лямбды захватить тот же ресурс(который уже схвачен) - ты получаешь дедлок. этож прям классическая ситуация.

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

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

SK

Sergey Kapralov in JUG NN
Romian Makhline
ты слишком много хочешь, как мне кажется. у тебя есть две сущности борющиеся за один не конкурентный в данном случае ресурс. более того, они хотят его уметь захватывать и отпускать позже.
это неразрешимая проблема.
то есть если первая инициализация началась - мы смело можем сказать, что ресурс мапы взят, но не отпущен до тех пор, пока лямбда не выполниться. так как ты хочешь внутри этой лямбды захватить тот же ресурс(который уже схвачен) - ты получаешь дедлок. этож прям классическая ситуация.

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

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

Ладно, на свежую голову позже ещё гляну.
источник

SK

Sergey Kapralov in JUG NN
На худой конец, мб действительно кеши поделю, у спринга там кеш фабрика вроде была. Просто чёт перебор малясь, да и с инвалидацией возни больше.
источник

RK

Roman Khlebnov in JUG NN
Sergey Kapralov
Границы лямбд - считай уже границы секций. Вложенность compute if absentов даёт дедлок на бакетах конкаррентхешмапы. Причём репродьюсится даже на одном треде, лок не реентрант... Получается этот нереентрант лок мапы нужно обойти, для этого кеши для обоих лямбд должны инициализироваться отдельно друг от друга. Но при этом хотелось бы оставить возможность вкладывать лямбды друг в друга. А дальше, чето напрашивается кеширующий декоратор на каждой из лямбд, с даблчек локом, а-ля - посмотреть кеш, если ничего не закешированно, вычислить лямбду, положить в кеш результат, вернуть.

Такое в сыром виде практикуется? Конкарренси - не самая сильная моя сторона если честно.
В сыром виде не видал такого, да и зачем юзать обычную мапу в качестве кэша? Я давно пользуюсь Caffeine, вполне доволен.
источник

RK

Roman Khlebnov in JUG NN
Кстати, если вспоминать функциональщину - вложенный computeIfAbsent вроде side effect, или мне кажется? Обычно такие штуки избегают.
источник

II

Iurii Iurchenko in JUG NN
Sergey Kapralov
Границы лямбд - считай уже границы секций. Вложенность compute if absentов даёт дедлок на бакетах конкаррентхешмапы. Причём репродьюсится даже на одном треде, лок не реентрант... Получается этот нереентрант лок мапы нужно обойти, для этого кеши для обоих лямбд должны инициализироваться отдельно друг от друга. Но при этом хотелось бы оставить возможность вкладывать лямбды друг в друга. А дальше, чето напрашивается кеширующий декоратор на каждой из лямбд, с даблчек локом, а-ля - посмотреть кеш, если ничего не закешированно, вычислить лямбду, положить в кеш результат, вернуть.

Такое в сыром виде практикуется? Конкарренси - не самая сильная моя сторона если честно.
Репродьюсится - ты прям воспроизвёл или ты это предвосхищяешь? Если что интристик локи - реентрант. Беглый взгляд на computeIfAbsent ничего кроме cas и интристик локов не детектит. Я пока склоняюсь к тому что проблемы нет.
источник

SK

Sergey Kapralov in JUG NN
Roman Khlebnov
В сыром виде не видал такого, да и зачем юзать обычную мапу в качестве кэша? Я давно пользуюсь Caffeine, вполне доволен.
Я уже выше говорил - там не обычная мапа. Там спринг кеш на мапе.
источник

SK

Sergey Kapralov in JUG NN
Iurii Iurchenko
Репродьюсится - ты прям воспроизвёл или ты это предвосхищяешь? Если что интристик локи - реентрант. Беглый взгляд на computeIfAbsent ничего кроме cas и интристик локов не детектит. Я пока склоняюсь к тому что проблемы нет.
Да, я прям воспроизвел
источник

RK

Roman Khlebnov in JUG NN
Sergey Kapralov
Я уже выше говорил - там не обычная мапа. Там спринг кеш на мапе.
То бишь дефолтный кэш провайдер
источник