Size: a a a

Kotlin Community

2020 July 28

VP

Vladimir Petrakovich in Kotlin Community
Алексей Ершов
У меня сейчас просто flow{} и внутри открывается канал. Как туда впихнуть suspendCancellableCoroutine?
Вы слишком разного уровня абстракции пытаетесь связать.
Сначала сделайте обёртку над SocketChannel, которая не блокирует поток и прекращает операцию при отмене вызывающей корутины, а потом уже к flow переходите.
источник

AN

Alexander Nozik in Kotlin Community
Алексей Ершов
Между - понятное дело, делаю, ensureActive. Но основное время все-таки проходит в блоке, в ожидании байтиков из сокета.
Ну так никак, оно таки блокируеще, тольк тред прерывать, что не рекомендуется.
источник

АЕ

Алексей Ершов... in Kotlin Community
Vladimir Petrakovich
Вы слишком разного уровня абстракции пытаетесь связать.
Сначала сделайте обёртку над SocketChannel, которая не блокирует поток и прекращает операцию при отмене вызывающей корутины, а потом уже к flow переходите.
Воо, отлично, это и хотел услышать) типа SuspendingSocketChannel
источник

АЕ

Алексей Ершов... in Kotlin Community
Готовых не знаете?
источник

VP

Vladimir Petrakovich in Kotlin Community
Алексей Ершов
У меня сейчас просто flow{} и внутри открывается канал. Как туда впихнуть suspendCancellableCoroutine?
Ну а впихивать надо в обертку над блокирующим read()
источник

VP

Vladimir Petrakovich in Kotlin Community
Алексей Ершов
Готовых не знаете?
В Ktor (CIO) всё должно быть. Причём такая реализация, которая вообще не блокирует треды.
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
В Ktor (CIO) всё должно быть. Причём такая реализация, которая вообще не блокирует треды.
так там скорее всего асинхронный канал
источник

АЕ

Алексей Ершов... in Kotlin Community
Надо блокирующий read заменить на suspend read, а внутри скорее всего будет SocketChannel с non-blocking mode
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
так там скорее всего асинхронный канал
Ну да, конечно)
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Ну да, конечно)
а для него проблем нет, там все ручки торчат
источник

АЕ

Алексей Ершов... in Kotlin Community
Vladimir Petrakovich
В Ktor (CIO) всё должно быть. Причём такая реализация, которая вообще не блокирует треды.
О, вот это очень интересно, пойду искать. Огромное спасибо!
источник

AN

Alexander Nozik in Kotlin Community
Алексей Ершов
Надо блокирующий read заменить на suspend read, а внутри скорее всего будет SocketChannel с non-blocking mode
Не получится
источник

АЕ

Алексей Ершов... in Kotlin Community
Alexander Nozik
Не получится
У ктора же получилось?)
источник

AN

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

AN

Alexander Nozik in Kotlin Community
Алексей Ершов
У ктора же получилось?)
так я не думаю, что там блокирующий канал.
источник

АЕ

Алексей Ершов... in Kotlin Community
А, да, точно, эту штуку видел.
источник

AN

Alexander Nozik in Kotlin Community
Ну а тут прблем нет, все ручки наружу торчат.
источник

VP

Vladimir Petrakovich in Kotlin Community
Алексей Ершов
Надо блокирующий read заменить на suspend read, а внутри скорее всего будет SocketChannel с non-blocking mode
Вы с SocketChannel без блокировки вряд ли что-то сделаете, non-blocking mode - это "не получилось без блокировки - ну и ладно, не буду делать".
источник

VP

Vladimir Petrakovich in Kotlin Community
А надо взять селектор (который из NIO) и вот это вот всё
источник

АЕ

Алексей Ершов... in Kotlin Community
Справедливо, пойду async версию и ктор изучать
источник