首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个异步协程以减少Kotlin中的执行时间

多个异步协程以减少Kotlin中的执行时间
EN

Stack Overflow用户
提问于 2021-01-08 00:59:30
回答 1查看 144关注 0票数 0

我有一个列表,我想用最少的执行次数来执行所有元素的1个繁重的任务。我的解决方案是创建大量的协程,这些协程等同于带有默认调度程序的列表中的元素。

示例:

代码语言:javascript
复制
list.map {
   async {
      // do heavy task
   }
}.awaitAll()

假设我有一个包含500个元素的map,并且我的设备最多有4个线程,可以并行运行最多4个繁重的任务。据我所知,将有4个线程并行执行4个任务,当一个线程执行完成时,将有一个任务分配给该线程并启动。另一个解决方案是为4个线程创建4个协程,每个线程依次执行125个任务。每个线程按顺序运行,限制了多个线程分配任务的时间。因此,它比我的解决方案更快。是对的吗?如果没有,最好的解决方案是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-01-08 01:48:52

我使用以下代码。

它包含了我需要转换成另一个对象类的大量元素的列表。

代码语言:javascript
复制
/**
     * Method that converts the [FullStopsInfo] list into [Station] list.
     */
    private fun fastConvert(data: MutableList<FullStopsInfo>): Vector<Station> {
        var data1 = data
        val stations = Vector<Station>()

        var offset = 0
        val range = data1.size / Utils.availableCores()// your 4 cores

        val queue = mutableListOf<Deferred<Int>?>()

        val timeProccessing = measureTimeMillis {
            while (data1.isNotEmpty()) {
                val newRange = min(if(range == 0) 1 else range, data1.size)
                val tempTransfers = data1.subList(0, newRange)

                val preferredTask = addToList(tempTransfers, stations)//the transformation goes here
                queue.add(preferredTask)
                preferredTask.start()

                // Move to the next range
                data1 = data1.subList(newRange, data1.size)
                offset += newRange
            }

            runBlocking {
                queue.forEach {
                    it?.await()//wait until all procceses ended
                }
            }
        }

        Log.d(TAG, "End findSearchAllFullDataStation with $timeProccessing")
        return stations
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65616746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档