Size: a a a

Kotlin Community

2020 August 02

CC

Constantine Cerberus in Kotlin Community
Eugene P.
Сделать собственный оператор буфферинга для flow, у которого будет какая-то функция определяющая конец пакета и отправляющая накопленные данные дальше
Можно примерно как вы это видите описать абстрактно
источник

EP

Eugene P. in Kotlin Community
@noraltavir на всякий случай имел в виду эту реализацию. Но, вероятно, вы можете и лучше что-то придумать https://dev.to/psfeng/a-story-of-building-a-custom-flow-operator-buffertimeout-4d95
источник

AN

Alexander Nozik in Kotlin Community
Eugene P.
@noraltavir на всякий случай имел в виду эту реализацию. Но, вероятно, вы можете и лучше что-то придумать https://dev.to/psfeng/a-story-of-building-a-custom-flow-operator-buffertimeout-4d95
С задержкой там все довольно тривиально. Ща, погодите, уже почти написал
источник

AN

Alexander Nozik in Kotlin Community
https://pastebin.com/dEs0Lj32 Не тестил пока правда. И не получилось чанками копировать. Это можно только с однобуквенными разделитлями
источник

AN

Alexander Nozik in Kotlin Community
и это мультиплатформа :)
источник

EP

Eugene P. in Kotlin Community
Constantine Cerberus
Можно примерно как вы это видите описать абстрактно
Сложно с телефона. Как-то так, наверное
packetsFlow
.bufferTransform(
{rawData -> splitToPacketsWithState(rawData)},
{packet -> packet.isCompleted}
)

bufferTransform надо написать еще
источник

EP

Eugene P. in Kotlin Community
на выходе он должен выдавать по одному пакету ну или список если надо
источник

EP

Eugene P. in Kotlin Community
Как референс я бы использовал bufferTimeout из статьи выше. Под капотом там ReceiveChannel
источник

AN

Alexander Nozik in Kotlin Community
Eugene P.
Как референс я бы использовал bufferTimeout из статьи выше. Под капотом там ReceiveChannel
Я выше скинул. Без промежуточных каналов. Тут не нужна асинхронная обработка.
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
https://pastebin.com/dEs0Lj32 Не тестил пока правда. И не получилось чанками копировать. Это можно только с однобуквенными разделитлями
Интересное решение к та при повторном ините byteArrayout размер буфера не указали 16 стока
источник

CC

Constantine Cerberus in Kotlin Community
Все время забываю про extension в котлине то постоянно их пишу то напроч отшыбает память про их существование
источник

AN

Alexander Nozik in Kotlin Community
Constantine Cerberus
Интересное решение к та при повторном ините byteArrayout размер буфера не указали 16 стока
о, спасиб. Сейчас еще потестю
источник

CC

Constantine Cerberus in Kotlin Community
Eugene P.
на выходе он должен выдавать по одному пакету ну или список если надо
По одному пакету список не имеет в моем случае смысла держать нужно как можно приближенные к риал тайму
источник

AN

Alexander Nozik in Kotlin Community
Там еще по хорошему надо где-то перейти в однопоточный контекст, чтобы не было конкуррентного collect
источник

AN

Alexander Nozik in Kotlin Community
Все тесты проходят, можно пользоваться. Запушу в либу в следующей итерации. Плюс добавлю реализацию для TCP и для USB/RS232/RS485
источник

CC

Constantine Cerberus in Kotlin Community
Alexander Nozik
Все тесты проходят, можно пользоваться. Запушу в либу в следующей итерации. Плюс добавлю реализацию для TCP и для USB/RS232/RS485
Nice
источник

EP

Eugene P. in Kotlin Community
@noraltavir у вас там случаем нет того же бага, когда последний не полный элемент может не заэммититься? Или он должен игнориться?
источник

AN

Alexander Nozik in Kotlin Community
Игнорится, нет гарантии, что последний. Поток-то бесконечный. До дома дойду, тест скину
источник

AM

Andrew Mikhaylov in Kotlin Community
Constantine Cerberus
По одному пакету список не имеет в моем случае смысла держать нужно как можно приближенные к риал тайму
Я, конечно, несколько со стороны за вашим общением наблюдаю, могу чего-то не понимать, но -- никто не мешает воткнуть ниже по флоу за бьющим на пакеты оператором буферизацию, если апстим должен выгребаться максимально быстро (буфер у железа маленький, к примеру), а даунстрим может иногда замедляться. Но, конечно, только при условии, что в среднем даунстрим всё равно будет быстрее апстрима.
источник

AN

Alexander Nozik in Kotlin Community
Andrew Mikhaylov
Я, конечно, несколько со стороны за вашим общением наблюдаю, могу чего-то не понимать, но -- никто не мешает воткнуть ниже по флоу за бьющим на пакеты оператором буферизацию, если апстим должен выгребаться максимально быстро (буфер у железа маленький, к примеру), а даунстрим может иногда замедляться. Но, конечно, только при условии, что в среднем даунстрим всё равно будет быстрее апстрима.
Там на самом деле если говорить про перформанс, по возможности надо все на месте обрабатывать, поскольку копирование  в байт-массив - дорогое, а чистка памяти за ним еще дороже. А во Flow нельзя отправлять реюзабельные буферы, потому что они тогда утекают. Но это уже тонкости супер-оптимизации. Если кому интересно, велком в слак в #io дизайнить асинхронную реализацию.
источник