Я пишу кооперативный многопоточный движок в Котлине. Я пытаюсь написать интерфейс следующим образом:
interface Processor { var suspendAction: (Continuation<Any>) -> Unit inline suspend fun yield() = suspendCoroutine(suspendAction) suspend fun process(inbox: Inbox) = Unit }
yield()
– это сервис, который я хочу предоставить всем разработчикам этого интерфейса. Поскольку каждый виртуальный сайт вызова представляет собой барьер для встраивания, и поскольку каждая точка входа в suspend fun
имеет свои затраты, по соображениям производительности мне нужна эта функция, чтобы быть final
, но Котлин не позволяет мне этого. Я нашел обходной способ превращения yield()
в расширение fun:
inline suspend fun Processor.yield() = suspendCoroutine(suspendAction)
Я хотел бы спросить, используют ли случаи использования, поскольку это может мотивировать дизайнеров языка Kotlin, чтобы позволить final fun
в interface
.
Обратите внимание, что в отличие от типичных сценариев приостановки ожидания для ввода-вывода здесь yield()
встречается в потоке с высокой интенсивностью процессора.