Size: a a a

Kotlin Community

2020 July 28

АЕ

Алексей Ершов... in Kotlin Community
Vladimir Petrakovich
Надо завернуть read() в suspendCancellableCoroutine и перед ним вешать коллбек на отмену, который закроет канал
и верно, не подумал, что можно просто внутри flow засуспендить read.
источник

АЕ

Алексей Ершов... in Kotlin Community
Vladimir Petrakovich
Ktor делает всё через engine, а там уж всякое бывает, особенно на андроиде
engine это для http client, а network лежит уровнем ниже
источник

АЕ

Алексей Ершов... in Kotlin Community
то есть, я так понял что engine работает на низкоуровневых сокетах, а не наоборот
источник

VP

Vladimir Petrakovich in Kotlin Community
Алексей Ершов
engine это для http client, а network лежит уровнем ниже
Ну да, но конкретный engine может делать запросы через что угодно (или не делать их вообще, есть реализация для тестов)
источник

VP

Vladimir Petrakovich in Kotlin Community
Через ktor-network работает только CIO
источник

АЕ

Алексей Ершов... in Kotlin Community
а я и хочу ktor-network напрямую использовать, без engine)
источник

VP

Vladimir Petrakovich in Kotlin Community
Алексей Ершов
а я и хочу ktor-network напрямую использовать, без engine)
Я вас не пойму. Вы если хотите неблокирующие сокеты на старом андроиде, оно не взлетит.
источник

AM

Andrew Mikhaylov in Kotlin Community
Алексей Ершов
я пока не понимаю как его закрыть если в корутине случился блокирующий read
В относительно свежих корутинах завезли вот такую штуку для кооперации между отменяемым миром корутин и прерываемым миром потоков. Я без понятия, реагирует ли read в NIO на прерывания, но, возможно, оно вам поможет.
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-interruptible.html
источник

АЕ

Алексей Ершов... in Kotlin Community
Vladimir Petrakovich
Я вас не пойму. Вы если хотите неблокирующие сокеты на старом андроиде, оно не взлетит.
я пока не понимаю, почему. Я вижу в ktor-network абстракцию для suspend-сокетов. Основной класс там - SocketImpl. У него под капотом ByteBufferChannel. И нигде в реализации этого модуля я не вижу AsynchronousSocketChannel. Пока не докопался досконально, но я так понимаю, что в Ktor просто написана своя версия неблокирующих сокетов, и из NIO там используется не всё.
источник

АЕ

Алексей Ершов... in Kotlin Community
Могу быть неправ на каждом шагу, разумеется, но попробовать запустить на 5 андроиде всё-таки хочу)
источник

АЕ

Алексей Ершов... in Kotlin Community
Andrew Mikhaylov
В относительно свежих корутинах завезли вот такую штуку для кооперации между отменяемым миром корутин и прерываемым миром потоков. Я без понятия, реагирует ли read в NIO на прерывания, но, возможно, оно вам поможет.
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-interruptible.html
ого, интересная штука, спасибо)
источник

АЕ

Алексей Ершов... in Kotlin Community
Щас покопаю и отпишусь попозже, как что работает. 3 гипотезы:
1) ktor-network
2) suspendCancellableCoroutine + blocking read
3) runInterruptible
источник

AM

Andrew Mikhaylov in Kotlin Community
Алексей Ершов
я пока не понимаю, почему. Я вижу в ktor-network абстракцию для suspend-сокетов. Основной класс там - SocketImpl. У него под капотом ByteBufferChannel. И нигде в реализации этого модуля я не вижу AsynchronousSocketChannel. Пока не докопался досконально, но я так понимаю, что в Ktor просто написана своя версия неблокирующих сокетов, и из NIO там используется не всё.
Вполне возможный вариант, так как на андроиде как-то работать надо. :)
источник

AM

Andrew Mikhaylov in Kotlin Community
Да и не только на андроиде, всё же котлин не JDK 8+
источник

АЕ

Алексей Ершов... in Kotlin Community
Да и на остальных платформах. Ktor же MPP всё-таки
источник

AM

Andrew Mikhaylov in Kotlin Community
Алексей Ершов
Да и на остальных платформах. Ktor же MPP всё-таки
Ну на остальных платформах NIO даже на полшишечки не используется, при этом они могут предоставлять свои примитивы для асинхронного I/O.
источник

АЕ

Алексей Ершов... in Kotlin Community
при runInterruptible из read вылетает ClosedByInterruptException. Неплохо, радует)
источник

AN

Alexander Nozik in Kotlin Community
источник

AS

Alex Shöenberg in Kotlin Community
Sup guys, just hopped to say hi✌🏻
I'm new to Kotlin but I won't bother you with my questions for now instead I'll go through the Docs and FAQ first :)
источник

D

Denys in Kotlin Community
Alex Shöenberg
Sup guys, just hopped to say hi✌🏻
I'm new to Kotlin but I won't bother you with my questions for now instead I'll go through the Docs and FAQ first :)
👋🏻 Feel free to send newbie questions to @kotlin_start channel.
источник