有多少协程太多?

Ale*_*nek 3 kotlin kotlin-coroutines

我需要加快对具有数百万个元素的某些集合的搜索。搜索谓词需要作为参数传递。

我一直想知道最简单的解决方案(至少到目前为止)是否将仅使用协程来完成任务。

我现在面临的问题是我一次可以实际创建多少个协程。:D附带说明一下,可能会同时运行多个这样的搜索。

每次进行这样的搜索,我都可以制造数百万个协程(每件物品一个)吗?我应该决定每个协程的工作量(例如每个协程1000个项目)吗?我还应该决定协程数量的上限吗?

我对协同程序及其实际工作方式有一个大概的了解,但是,我不知道此功能的性能限制是什么。

谢谢!

Mar*_*nik 6

协程的内存权重与从协程构建器块到悬挂点的调用轨迹的深度成比例。每个suspend fun调用将另一个Continuation对象添加到链接列表,并且在协程被挂起时将保留该对象。一个Continuation实例的粗略数字是100个字节。

因此,如果呼叫跟踪深度为5,则每项总计500字节。一百万个项目是500 MB。

但是,除非您的搜索代码涉及阻止使线程保持空闲的操作,否则您不会从协程中获得任何好处。您的任务看起来更像是数据并行处理的实例,您可以使用java.util.streamAPI 非常有效地解决它(正如用户marstran在评论中指出的那样)。