我明白,第一个也是最明显的想法是,你不应该让它存在,而是拿着一分钟。我同事的意见是,您应该这样做,因为您可能有CPU密集型计算,但不会挂起协程,但我们可以帮助Kotlin的编译器识别它,并重新调度调用者协程(如果它存在),并且不会“阻塞”底层线程。有人能告诉我这个主题吗?如果它还没有实现,我认为这可能是一个很酷的想法,但我对Kotlin协程的内部了解不多🙂
zzwlnbp81#
我不认为把一个函数标记为suspend,如果它不挂起的话,会有任何性能上的好处,实际上恰恰相反,挂起函数会产生开销,即使不挂起,也会影响性能。即使一个函数没有挂起,仍然有理由让它挂起。一个例子是,如果我们希望将来让它挂起。那么从一开始就标记它是一个好主意,因为以后再做是向后不兼容的更改。另外,通过使它挂起,我们可以添加对取消的支持,并且我们可以不时地执行yield(),以允许其他任务跳过它。这样做可以使CPU密集型代码更加协程化-友好的。但老实说,我真的不明白这一点:"帮助Kotlin的编译器识别它"。CPU密集型计算根据定义是不可挂起的。Kotlin编译器和协程框架都不会仅仅因为函数说"挂起"而区别对待该函数。它将正常执行,并将"阻塞"调用线程,直到计算完成。
suspend
yield()
1条答案
按热度按时间zzwlnbp81#
我不认为把一个函数标记为
suspend
,如果它不挂起的话,会有任何性能上的好处,实际上恰恰相反,挂起函数会产生开销,即使不挂起,也会影响性能。即使一个函数没有挂起,仍然有理由让它挂起。一个例子是,如果我们希望将来让它挂起。那么从一开始就标记它是一个好主意,因为以后再做是向后不兼容的更改。另外,通过使它挂起,我们可以添加对取消的支持,并且我们可以不时地执行
yield()
,以允许其他任务跳过它。这样做可以使CPU密集型代码更加协程化-友好的。但老实说,我真的不明白这一点:"帮助Kotlin的编译器识别它"。CPU密集型计算根据定义是不可挂起的。Kotlin编译器和协程框架都不会仅仅因为函数说"挂起"而区别对待该函数。它将正常执行,并将"阻塞"调用线程,直到计算完成。