|
|
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczquestionerСогласен, но распределение это обычно маленькая часть от работы. Во многих случаях это нормально. А Вы можете предложить более производительный вариант? А "производительность" она в многопоточности штука относительная. Мы же не знаем ни на сколько конкурентной будет борьба за критические ресурсы, ни на сколько часто у будут пересекаться ключи. В зависимости от подобных параметров разные решения будут выдавать разную производительность. Согласен, Вы считаете, что текстом нужно было это отразить? Как по мне это решение явно не проигрывает никакому из тех, что мне в голову пришли. Если бы у меня для одного распределения было решение явно лучше, чем для другого, то я бы это указал. Может какие то решения и будут лучше, но явно не на порядок и надо садиться и измерять, а тут ведь явно была задача на алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 22:11 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
questionervimba, Ну допустим. там уже предложили вариант полаконичнее с whenCompleteAsync С whenCompleteAsync у меня все мои тесты прошли нормально, нет проблем не с утечками паямити, не с паралельным выполнением по одному ключу, не с бесконечным зацикливанием. Думаю ситуация с ревью развивалась следующим образом: у них есть набор заковыристых тестов, включая и таски падающие с эксепшенами и таски мгновенно завершающиеся, тесты пофэйлились потому, что у тебя тред повис из-за remove внутри compute, профилировать не стали(а я твой код пронаблюдал в Mission Control где он у тебя зависает), и просто быстро просмотрев код отписали самое на первый взгляд очевидное - проблема в remove, не доглядев как и я что remove не просто по ключу. В общем я бы на твоем месте сильно не обижался не проверяющих, потому что в коде бага была, и даже с первого раза ты её правильно не исправил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 22:20 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAndrei TЯ, если честно, про твои сегменты и время операций даже не думал. synchronized(this) - это хорошо известный антипаттерн (в большинстве случаев). Обычно сходятся на том, что следует явно указывать модификатор synchronized в сигнатуре public метода. Пипец. Капитан очевидность не унимается. Тут вообще-то все в курсе как использовать synchronized. Это была иллюстрация того как будет работать код при коллизии хэшей. Термин "иллюстрация" объяснить? Эк тебя бомбит. Где тут, кстати, можно ознакомиться с перечнем того, о чем еще все в курсе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 23:04 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
questionerЕсли имелось ввиду то, что whenComplete(Async) может не выполниться, то это не правда Наверно все-таки имелось в виду то, что надо делать так: Код: java 1. 2. 3. 4. 5. Иначе возникает race condition между экзекутором и тредом, выполняющим compute, и как следствие блокировка с зависанием в отдельных случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 23:09 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
vimbaquestionervimba, Ну допустим. там уже предложили вариант полаконичнее с whenCompleteAsync С whenCompleteAsync у меня все мои тесты прошли нормально, нет проблем не с утечками паямити, не с паралельным выполнением по одному ключу, не с бесконечным зацикливанием. Думаю ситуация с ревью развивалась следующим образом: у них есть набор заковыристых тестов, включая и таски падающие с эксепшенами и таски мгновенно завершающиеся, тесты пофэйлились потому, что у тебя тред повис из-за remove внутри compute, профилировать не стали(а я твой код пронаблюдал в Mission Control где он у тебя зависает), и просто быстро просмотрев код отписали самое на первый взгляд очевидное - проблема в remove, не доглядев как и я что remove не просто по ключу. В общем я бы на твоем месте сильно не обижался не проверяющих, потому что в коде бага была, и даже с первого раза ты её правильно не исправил. Ну это недочёт) Не то, чтобы я действительно искал работу, меня моя работа вполне устраивает. Просто интересно было решить задание и было время для этого. Я потратил время и решил таки задачу. Я считаю, что я решение придумал и это самое главное, а мелочи небольшие...так без этого никуда. А мне ответили, что я всё не так сделал и идея неправильная. Ну если вы уж даёте такую задачу - будьте в ней экспертами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 23:35 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Andrei TquestionerЕсли имелось ввиду то, что whenComplete(Async) может не выполниться, то это не правда Наверно все-таки имелось в виду то, что надо делать так: Код: java 1. 2. 3. 4. 5. Иначе возникает race condition между экзекутором и тредом, выполняющим compute, и как следствие блокировка с зависанием в отдельных случаях. я думаю это по другому называется) просто произойдёт зависание в случае если таска выплюнет эксекпшн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 23:37 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
questionerAndrei Tпропущено... Наверно все-таки имелось в виду то, что надо делать так: Код: java 1. 2. 3. 4. 5. Иначе возникает race condition между экзекутором и тредом, выполняющим compute, и как следствие блокировка с зависанием в отдельных случаях. я думаю это по другому называется) просто произойдёт зависание в случае если таска выплюнет эксекпшн Даже если не выплюнет, а просто выполнится раньше, чем будет привязан колбэк. На второй странице это обсуждали. В принципе не суть важно, как это называть, но обычно зависимость результата от порядка выполнения кода в многопоточной среде называют именно так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 00:06 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Andrei Tquestionerпропущено... я думаю это по другому называется) просто произойдёт зависание в случае если таска выплюнет эксекпшн Даже если не выплюнет, а просто выполнится раньше, чем будет привязан колбэк. На второй странице это обсуждали. В принципе не суть важно, как это называть, но обычно зависимость результата от порядка выполнения кода в многопоточной среде называют именно так :) Если просто раньше выполнится - всё будет Ok ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 01:10 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
questionerAndrei Tпропущено... Даже если не выплюнет, а просто выполнится раньше, чем будет привязан колбэк. На второй странице это обсуждали. В принципе не суть важно, как это называть, но обычно зависимость результата от порядка выполнения кода в многопоточной среде называют именно так :) Если просто раньше выполнится - всё будет Ok Ты вроде сам уже проверял, что Ок не будет: 20769167 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 01:19 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Вообще вам с Blazkowicz стоит подумать об открытии адвокатской конторы. Что-нибудь типа "Blazkowicz и партнеры". Вот уж где пригодится манера спорить до усрачки с любым утверждением собеседника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 01:31 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
questionerСогласен, Вы считаете, что текстом нужно было это отразить? Как по мне это решение явно не проигрывает никакому из тех, что мне в голову пришли. Поэтому надо написать самый простой вариант и текстом дописать, мол "тут возможная таая-то проблема с перформансом, если вылезет- поменяйте так". Вы не понимаете важность простоты. Может придёт со временем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 05:45 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
questionerЯ считаю, что я решение придумал и это самое главное, а мелочи небольшие...так без этого никуда. А мне ответили, что я всё не так сделал и идея неправильная. Полгода назад я сказал "надо брать" посмотрев ошибочный код человека. Потому что он попросил (и я ему дал) задачу, слишком сложную для него. Код был с ошибкой, но читался легко и приятно. За эти полгода я ни разу не пожалел- он и пишет отличный (в т.ч. быстрый и правильный) код, и ревьювит другой код отлично. Не так сложно научится писатьработающий код. А вот научится писать простой и поддерживаемый код намного сложнее. У Вас код именно плохо поддерживаемый. И Вы этого непонимаете. questionerНу если вы уж даёте такую задачу - будьте в ней экспертами. Вы применили совершенно неожиданный подход. Знать его заранее было невозможно, а разбираться сложнл. Да и не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 05:51 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Andrei TВообще вам с Blazkowicz стоит подумать об открытии адвокатской конторы. Что-нибудь типа "Blazkowicz и партнеры". Вот уж где пригодится манера спорить до усрачки с любым утверждением собеседника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 08:09 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Alexey TominПоэтому надо написать самый простой вариант и текстом дописать, мол "тут возможная таая-то проблема с перформансом, если вылезет- поменяйте так". Вы не понимаете важность простоты. Может придёт со временем. Полностью поддерживаю. Уже несколько лет за собой замечаю, что основное время при кодинге трачу на поиск наиболее простого решения. Но в данном конкретном случае можно и поспорить. Я бы начал реализовывать через putIfAbsent и явные очереди, а не цепочку Futures. Но есть серьезные подозрения, что проще не получится. Давайте конкретизируем. Что именно в приведенном решение "сложно"? Кроме синхронизации через атомарный compute(), по-моему, ничего. И в данном случае этот момент легко было бы исправить комментарием в коде. Мол compute атомарный и тем самым гарантирует синхронизацию по ключу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 08:15 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДавайте конкретизируем. Что именно в приведенном решение "сложно"? Кроме синхронизации через атомарный compute(), по-моему, ничего. И в данном случае этот момент легко было бы исправить комментарием в коде. Мол compute атомарный и тем самым гарантирует синхронизацию по ключу. Именно что compute. Он служит для управления содержимом map'ы. А тут мы управляем, по сути, очередью задач. Т.е. в решении есть "очередь", но она реализована неявно а вставка- через метод map'ы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 08:19 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Alexey TominИменно что compute. Он служит для управления содержимом map'ы. А тут мы управляем, по сути, очередью задач. Т.е. в решении есть "очередь", но она реализована неявно а вставка- через метод map'ы. whenCompleteAsync() это "очередь" compute() это синхронизация Если дать переменным более логичные имена и вставить пару комментариев, то будет намного более понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 08:28 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAlexey TominИменно что compute. Он служит для управления содержимом map'ы. А тут мы управляем, по сути, очередью задач. Т.е. в решении есть "очередь", но она реализована неявно а вставка- через метод map'ы. whenCompleteAsync() это "очередь" compute() это синхронизация Если дать переменным более логичные имена и вставить пару комментариев, то будет намного более понятно. Да, может быть вся проблема в плохих именах и недостатке небольшого описания. Получается, что красивая идея полностью загублена такой вроде фигнёй. Но именно что загублена напрочь, т.е. код стал плохим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 08:53 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAlexey TominИменно что compute. Он служит для управления содержимом map'ы. А тут мы управляем, по сути, очередью задач. Т.е. в решении есть "очередь", но она реализована неявно а вставка- через метод map'ы. whenCompleteAsync() это "очередь" compute() это синхронизация Если дать переменным более логичные имена и вставить пару комментариев, то будет намного более понятно. Blazkowicz, направьте меня, я не пойму, где синхронизация, questioner пишет "Это довольно легко проверить если сделать Thread.sleep внутри compute и сделать из разных потоков put с одинаковыми ключами.", но это как раз и вводит "искусственную синхронизацию". По мне, автор задания правильно описал ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 09:41 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
0FDBlazkowicz, направьте меня, я не пойму, где синхронизация, questioner пишет "Это довольно легко проверить если сделать Thread.sleep внутри compute и сделать из разных потоков put с одинаковыми ключами.", но это как раз и вводит "искусственную синхронизацию". По мне, автор задания правильно описал ошибку. Согласно документации метод compute() выполняется атомарно . На практике это обозначает что для разных ключей метод исполняется пареллельно, а для ключей из одного бакета, метод блокируется. По-моему это единственный, возможный, недостаток. Это и есть та самая синхронизацию по ключу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 09:48 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczСогласно документации метод compute() выполняется атомарно . На практике это обозначает что для разных ключей метод исполняется пареллельно, а для ключей из одного бакета, метод блокируется. По-моему это единственный, возможный, недостаток. Это и есть та самая синхронизацию по ключу. Да, но здесь блокируется на время создания future, а taskMap.remove разве не выполняется в потоке myTask( который выполняет complete), запущенной из CompletableFuture.runAsync? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 09:58 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
0FDДа, но здесь блокируется на время создания future, а taskMap.remove разве не выполняется в потоке myTask( который выполняет complete), запущенной из CompletableFuture.runAsync? Ну, так в этом же и основная ошибка была. taskMap.remove() надо было вызывать через whenCompleteAsync(), чтобы он случайно не выполнился внутри compute(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 10:04 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz0FDДа, но здесь блокируется на время создания future, а taskMap.remove разве не выполняется в потоке myTask( который выполняет complete), запущенной из CompletableFuture.runAsync? Ну, так в этом же и основная ошибка была. taskMap.remove() надо было вызывать через whenCompleteAsync(), чтобы он случайно не выполнился внутри compute(). Я честно, не читал все, но если taskMap.remove() в whenCompleteAsync(), тогда где блокировка? нет future - создали-запустили-вышли, есть - по окончании запустили остальные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 10:10 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
0FDЯ честно, не читал все Ну, да. Отличный повод повторить. 0FD, но если taskMap.remove() в whenCompleteAsync(), тогда где блокировка? Внутри compute() http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/concurrent/ConcurrentHashMap.java Строки 1868 и 1848. 0FDнет future - создали-запустили-вышли, есть - по окончании запустили остальные. Блокировка не на выполнение, а только на постановку в очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 10:18 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
Andrei Tquestionerпропущено... Если просто раньше выполнится - всё будет Ok Ты вроде сам уже проверял, что Ок не будет: 20769167 Ну ты опять ничего не понял) Код: java 1. 2. 3. 4. так работает нормально. По ссылке проблема в том, что колбэк должен был выполняться в треде таски и поэтому перед завершением этой таски я жду когда compute вызовет whenComplete. Если whenComplete вызвался когда таска уже завершилась, то коллбэк выховется в треде compute. а твой код Код: java 1. 2. 3. 4. 5. решает проблему если эксепшн вылетит. Теперь понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 10:22 |
|
||
|
Сказали, что выполнил тестовое задание неправильно, я с этим не согласен. Кто прав?
|
|||
|---|---|---|---|
|
#18+
0FDBlazkowiczСогласно документации метод compute() выполняется атомарно . На практике это обозначает что для разных ключей метод исполняется пареллельно, а для ключей из одного бакета, метод блокируется. По-моему это единственный, возможный, недостаток. Это и есть та самая синхронизацию по ключу. Да, но здесь блокируется на время создания future, а taskMap.remove разве не выполняется в потоке myTask( который выполняет complete), запущенной из CompletableFuture.runAsync? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Выяснили, что если CompletableFuture.runAsyn уже закончилось к строке future.whenComplete то тело whenComplete будет вызвано в треде compute ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2017, 10:27 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39515414&tid=2122587]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 346ms |

| 0 / 0 |
