Size: a a a

Kotlin Community

2020 May 20

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Всё оранжевое - это CoroutineScheduler$Worker.park
Для того, чтобы поток переиспользовался, он должен быть свободен в момент старта таски. Вероятность этого маленькая
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Там ровно 3 что-то делающих корутины запущенно в withContext(IO)
И они внутри ничего не плодят?
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
И они внутри ничего не плодят?
Нет. Одна блокируется на чтение, другая читает из канала и блокируется на записи, третья - то же самое, только наоборот. Три цикла и больше ничего.
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Нет. Одна блокируется на чтение, другая читает из канала и блокируется на записи, третья - то же самое, только наоборот. Три цикла и больше ничего.
Так каждое чтение/запись - это новая корутина. Нет?
источник

BP

Bogdan Panchenko in Kotlin Community
Vladimir Petrakovich
Такое поведение Dispatchers.IO - это норма? У меня 3 блокирующих задачи, и такое ощущение, что они прыгают между потоками, периодически создавая новые. При этом большая часть потоков ничего не делает.
По каким вообще правилам выделяются новые потоки и когда они останавливаются? Где-нибудь об этом можно почитать?
А потоки со временем добавлялись или они сразу выделись 🤔
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
Так каждое чтение/запись - это новая корутина. Нет?
Нет, всё последовательно
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Petrakovich
Нет, всё последовательно
Если там несколько потоков, то уже не последовательно.
источник

i

i_vovolk in Kotlin Community
Alexander Nozik
Не сомневаюсь. Но в означенной статье Елизарова все довольно концептуально показано.
а можно еще раз ссылку, пожалуйста, а то из конфы 404 была
источник

VP

Vladimir Petrakovich in Kotlin Community
Bogdan Panchenko
А потоки со временем добавлялись или они сразу выделись 🤔
Трудно сказать, не ставил точку останова. Но во время выполнения периодически запускались новые.
источник

AN

Alexander Nozik in Kotlin Community
i_vovolk
а можно еще раз ссылку, пожалуйста, а то из конфы 404 была
источник

BP

Bogdan Panchenko in Kotlin Community
Vladimir Petrakovich
Нет, всё последовательно
Чтения из канала разве не саспенд (я толком с ними не работал)
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
Чтения из канала разве не саспенд (я толком с ними не работал)
да
источник

VP

Vladimir Petrakovich in Kotlin Community
Bogdan Panchenko
Чтения из канала разве не саспенд (я толком с ними не работал)
Да, ну так одновременно только одна операция выполняется
источник

i

i_vovolk in Kotlin Community
благодарю
источник

AN

Alexander Nozik in Kotlin Community
Я и говорю, что оно на send суспендится и ищет новый поток на блокирующий вызов
источник

VP

Vladimir Petrakovich in Kotlin Community
То есть либо корутина спит, ожидая что-то в канале, либо пишет его содержимое в поток
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
Я и говорю, что оно на send суспендится и ищет новый поток на блокирующий вызов
Логично, но при этом точно известно, что почти все потоки свободны. Откуда/зачем новые - непонятно?
источник

DZ

Dmitriy Zhirnov in Kotlin Community
где-то в августе-сентябре была какая-то фигня с кторовским сокетом... aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect()
каждый новый коннект плодил новые потоки при наличии десятка свободных... некоторые бокировались навсегда...
где-то там около октября обновились корутины и эта фигня прекратилась
источник

VP

Vladimir Petrakovich in Kotlin Community
Vladimir Petrakovich
Такое поведение Dispatchers.IO - это норма? У меня 3 блокирующих задачи, и такое ощущение, что они прыгают между потоками, периодически создавая новые. При этом большая часть потоков ничего не делает.
По каким вообще правилам выделяются новые потоки и когда они останавливаются? Где-нибудь об этом можно почитать?
Похоже, все ответы в доке CoroutineScheduler:
"Scheduler consists of corePoolSize worker threads to execute CPU-bound tasks and up to maxPoolSize lazily created threads to execute blocking tasks."
corePoolSize - 8+2 = 10, плюс один поток всегда заблокирован.
источник

VP

Vladimir Petrakovich in Kotlin Community
И keepAlive у потоков - 60 сек по дефолту. Однако, не мало.
источник