Size: a a a

Kotlin Community

2020 June 07

X

X in Kotlin Community
Bogdan Panchenko
Да. Можно сделать специальный тест . Также можно продебажить на тестовых данных, если есть где-то непонимания
Просто есть непонимание того, что тестировать. Там банально все:
Если id = otherId && clientId = otherClientId ,  то взять этот ордер и удалить из list'а. Все. Какие тестовые данные для конкретно этой ситуации?там в логах чётко указано, что после "удаления" элемента в списке содержится элемент с таким же id и clientId. А значит он, по идее, должен был быть удалён. Тут либо косяк байт кода (что 99.9% не так), либо дубликаты в исходном списке (что тоже исключено, потому как этот list в мапу устанавливается в двух местах :
1. В приведённом коде
2. В первом запросе к бирже, в результате которого все ордера добавляются в мапу и больше они не переназначаются, кроме как в первом пункте
источник

BP

Bogdan Panchenko in Kotlin Community
X
Просто есть непонимание того, что тестировать. Там банально все:
Если id = otherId && clientId = otherClientId ,  то взять этот ордер и удалить из list'а. Все. Какие тестовые данные для конкретно этой ситуации?там в логах чётко указано, что после "удаления" элемента в списке содержится элемент с таким же id и clientId. А значит он, по идее, должен был быть удалён. Тут либо косяк байт кода (что 99.9% не так), либо дубликаты в исходном списке (что тоже исключено, потому как этот list в мапу устанавливается в двух местах :
1. В приведённом коде
2. В первом запросе к бирже, в результате которого все ордера добавляются в мапу и больше они не переназначаются, кроме как в первом пункте
Байт код можно проверить. А тестировать нужно саму идею/реализацию.
источник

BP

Bogdan Panchenko in Kotlin Community
@rebornius саспенд вызовы, могло произойти такое ? Делается запрос и сразу же другой, где вот и совпадают id. Поскольку саспенд вызов может прерывается, первый может выполнится позже чем второй либо посредине (если есть саспенд вызовы). Что ещё может быть хз
источник

X

X in Kotlin Community
Bogdan Panchenko
@rebornius саспенд вызовы, могло произойти такое ? Делается запрос и сразу же другой, где вот и совпадают id. Поскольку саспенд вызов может прерывается, первый может выполнится позже чем второй либо посредине (если есть саспенд вызовы). Что ещё может быть хз
Вызовы то саспенд, но вот приведённый код не запускается в параллели. Там есть подписка на ReceiveChannel. В результате получения нового объекта в канале вызывается коллбэк согласно типу объекта. И пока этот коллбэк не завершится, процесс дальше не пойдёт. И даже если бы что то там пошло, то ведь я имею list, а не ArrayList. Хоть в сто потоков запускать можно, а данные не будут дублироваться. Да, могут потеряться, но не продублироваться (конкретно в такой реализации, как в приведённом коде)
источник

X

X in Kotlin Community
Bogdan Panchenko
Байт код можно проверить. А тестировать нужно саму идею/реализацию.
В общем, пока что добавил логгирование на разных этапах и буду тестить, торгуя на бирже. Вдруг ситуация повторится. Склоняюсь к идее с дублированием, но причин дублирования не нахожу.
Спасибо за помощь, Богдан!
источник

BP

Bogdan Panchenko in Kotlin Community
X
Вызовы то саспенд, но вот приведённый код не запускается в параллели. Там есть подписка на ReceiveChannel. В результате получения нового объекта в канале вызывается коллбэк согласно типу объекта. И пока этот коллбэк не завершится, процесс дальше не пойдёт. И даже если бы что то там пошло, то ведь я имею list, а не ArrayList. Хоть в сто потоков запускать можно, а данные не будут дублироваться. Да, могут потеряться, но не продублироваться (конкретно в такой реализации, как в приведённом коде)
Я говорю про мапу а не про лист. Саспенд не гарантирует что вы будете выполнятся на одном потоке
источник

BP

Bogdan Panchenko in Kotlin Community
У вас есть состояния - мапа, на нее нужно и смотреть
источник

X

X in Kotlin Community
Bogdan Panchenko
У вас есть состояния - мапа, на нее нужно и смотреть
Пример:
val map = HashMap<String, List<Int>>()

fun updateMap(){
var arr = map["someKey"] ?: emptyList()
arr = arr - 1
arr = arr + 1
map["someKey"] = arr
}

Хоть в 500 потоках такое запускать, дублей быть не должно. Или я чего то не знаю?
источник

QH

Quantum Harmonizer in Kotlin Community
X
Пример:
val map = HashMap<String, List<Int>>()

fun updateMap(){
var arr = map["someKey"] ?: emptyList()
arr = arr - 1
arr = arr + 1
map["someKey"] = arr
}

Хоть в 500 потоках такое запускать, дублей быть не должно. Или я чего то не знаю?
запусти в двух потоках — и в лучшем случае из внутренностей HashMap начнут высыпаться эксепшены
источник

X

X in Kotlin Community
Quantum Harmonizer
запусти в двух потоках — и в лучшем случае из внутренностей HashMap начнут высыпаться эксепшены
Но не дубли появлятся. Concurrentmodificationexception - это не про дубли, и этого здесь тоже нет
источник

QH

Quantum Harmonizer in Kotlin Community
X
Но не дубли появлятся. Concurrentmodificationexception - это не про дубли, и этого здесь тоже нет
CME вообще про другое
источник

BP

Bogdan Panchenko in Kotlin Community
X
Пример:
val map = HashMap<String, List<Int>>()

fun updateMap(){
var arr = map["someKey"] ?: emptyList()
arr = arr - 1
arr = arr + 1
map["someKey"] = arr
}

Хоть в 500 потоках такое запускать, дублей быть не должно. Или я чего то не знаю?
саспенда ведь нет
источник

ПГ

Павло Гриник... in Kotlin Community
Если писать в мапу с нескольких потоков - будут дубли
источник

QH

Quantum Harmonizer in Kotlin Community
всё было бы слишком хорошо, если бы на гонки сыпались CME
источник

X

X in Kotlin Community
Павло Гриник
Если писать в мапу с нескольких потоков - будут дубли
Каким образом, можно пример?
источник

BP

Bogdan Panchenko in Kotlin Community
X
Каким образом, можно пример?
вам нужна лекция про конкаренси
источник

X

X in Kotlin Community
Bogdan Panchenko
вам нужна лекция про конкаренси
В конкретно этой ситуации нет concurrency.
И я не прошу лекцию, я прошу пример, когда в мапе может появится список с одинаковыми элементами из за работы из множества потоков. Причём надо учитывать, что это не ArrayList, а лист
источник

QH

Quantum Harmonizer in Kotlin Community
X
В конкретно этой ситуации нет concurrency.
И я не прошу лекцию, я прошу пример, когда в мапе может появится список с одинаковыми элементами из за работы из множества потоков. Причём надо учитывать, что это не ArrayList, а лист
работа из множества потоков — и есть конкарренси (грубо говоря)
источник

BP

Bogdan Panchenko in Kotlin Community
X
В конкретно этой ситуации нет concurrency.
И я не прошу лекцию, я прошу пример, когда в мапе может появится список с одинаковыми элементами из за работы из множества потоков. Причём надо учитывать, что это не ArrayList, а лист
просто листа не существует, там под капотом аррай обычно
источник

BP

Bogdan Panchenko in Kotlin Community
Quantum Harmonizer
работа из множества потоков — и есть конкарренси (грубо говоря)
+
источник