Есть ли контекст для сопрограмм, который создает новые потоки до предела, например ThreadPoolExecutor?

Я хотел бы, чтобы мое приложение немного автоматически масштабировалось, если будет поступать больше запросов, но я также хотел бы использовать неблокирующие сопрограммы, предоставляемые Kotlin.

Глядя на документацию, кажется, что единственный способ получить контекст из stdlib - это использовать _ 1_ или _ 2_ оба создают экземпляры _ 3_, но похоже, что это все.

Есть ли способ получить что-то похожее на ThreadPoolExecutor в java, которое просто запускает новые потоки, если в настоящее время ни один поток не может выполнить работу до заданного предела для CoroutineContext в Kotlin? Это вообще правильный подход к сопрограммам?


person usbpc102    schedule 02.03.2018    source источник


Ответы (1)


Вы можете превратить любой Executor, который у вас есть, в контекст сопрограммы:

val MyContext = myExecutor.asCoroutineDispatcher()

Это вообще правильный подход к сопрограммам?

Это больше зависит от того, что вы делаете с сопрограммами, чем от того, какой пул потоков вы используете.

Я использую кэшированный пул потоков, как вы его описали, в своем приложении. Это приложение для Android, поэтому важно оставаться стройным. Я использую пул потоков как для блокировки сетевых операций, так и для работы с интенсивным использованием ЦП, которую я должен выполнять вне потока графического интерфейса. В таком случае вы не launch (MyThreadPool) свои сопрограммы, а launch(UI), а затем withContext(MyThreadPool) { heavyWork }.

person Marko Topolnik    schedule 02.03.2018
comment
Моя рабочая нагрузка на стороне сервера. Чтобы быть конкретным, это бот для Discord и запускает сопрограмму для каждого входящего события. В сопрограммах не происходит блокирующего ввода-вывода, просто используется незначительное использование ЦП. Единственный ввод-вывод, который будет происходить, - это неблокирование или, скорее, блокировка выполняется в потоках, обрабатываемых другой библиотекой. - person usbpc102; 02.03.2018
comment
Тогда мне интересно, как вы используете сопрограммы. Вы звоните кому-нибудь suspend funs? - person Marko Topolnik; 02.03.2018
comment
Не сейчас, но я сделаю это. Я полагаю, что сейчас я использую их больше как простой способ фиксировать задания в пуле потоков в kotlin. Но есть еще одна область, которая часто приостанавливается, поэтому я обязательно воспользуюсь ею. - person usbpc102; 02.03.2018