【问题标题】:Is there a context for corutines that creates new threads up to a limit like a ThreadPoolExecutor?是否有用于创建新线程的协程的上下文,例如 ThreadPoolExecutor?
【发布时间】:2018-03-02 12:32:46
【问题描述】:

如果有更多请求进来,我想让我的应用程序自动扩展一点,但我也想使用 Kotlin 提供的非阻塞协程。

查看文档,似乎从 stdlib 获取上下文的唯一方法是使用 newSingleThreadContextnewFixedThreadPoolContext 都创建 ThreadPoolDispacher 的实例,但似乎就是这样。

如果当前没有线程可以完成工作直到 Kotlin 中 CoroutineContext 的给定限制,有没有办法获得类似于 java 中的 ThreadPoolExecutor 的行为?这甚至是处理协程的正确方法吗?

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    您可以将任何Executor 转换为协程上下文:

    val MyContext = myExecutor.asCoroutineDispatcher()
    

    这甚至是处理协程的正确方法吗?

    这更多地取决于您对协程所做的工作,而不是您使用的线程池类型。

    正如您所描述的,我在我的应用程序中使用了缓存线程池。这是一款 Android 应用程序,因此保持苗条很重要。我将线程池用于阻塞网络操作和我必须在 GUI 线程之外完成的 CPU 密集型工作。在这样的用例中,你不是 launch (MyThreadPool) 你的协程,而是 launch(UI) 然后 withContext(MyThreadPool) { heavyWork }

    【讨论】:

    • 我的工作负载在服务器端。具体来说,它是一个不和谐的机器人,并为每个传入事件启动一个协程。协程中没有阻塞 IO 发生,只是 CPU 的使用量很小。唯一会发生的 IO 是非阻塞的,或者阻塞是在另一个库处理的线程中完成的。
    • 那么我想知道你是如何利用协程的。你打电话给suspend funs 吗?
    • 现在不行,但我会的。我想我现在更多地将它们用作将作业提交到 kotlin 中的线程池的简单方法。但是还有另一个领域正在做很多暂停,所以我肯定会在那里使用它。
    猜你喜欢
    • 2017-10-07
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多