Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Kotlin中使用线程或协同程序更好吗?_Multithreading_Kotlin_Kotlin Coroutines - Fatal编程技术网

Multithreading 在Kotlin中使用线程或协同程序更好吗?

Multithreading 在Kotlin中使用线程或协同程序更好吗?,multithreading,kotlin,kotlin-coroutines,Multithreading,Kotlin,Kotlin Coroutines,我在发一封申请信。由于邮件发送需要时间并阻塞主线程,我正在创建一个新线程,并将邮件发送任务移交给新线程。对于发送邮件的大量并发请求,我必须创建大量线程。但创建线程似乎很慢 我的问题是,如果我使用Kotlin的协同程序,它是否比线程提供更好的性能 某种解释或暗示是非常值得注意的。非常值得讨论的问题。我的答案是基于我自己的经验和很少的网络链接到众所周知的参考 如果你用Kotlin写作,我会一直使用协同程序 1.演出 创建太多线程实际上会使应用程序失败 在某些情况下表现不佳;线程是施加 对象分配和垃

我在发一封申请信。由于邮件发送需要时间并阻塞主线程,我正在创建一个新线程,并将邮件发送任务移交给新线程。对于发送邮件的大量并发请求,我必须创建大量线程。但创建线程似乎很慢

我的问题是,如果我使用Kotlin的协同程序,它是否比线程提供更好的性能


某种解释或暗示是非常值得注意的。

非常值得讨论的问题。我的答案是基于我自己的经验和很少的网络链接到众所周知的参考

如果你用Kotlin写作,我会一直使用协同程序

1.演出

创建太多线程实际上会使应用程序失败 在某些情况下表现不佳;线程是施加 对象分配和垃圾回收期间的开销

为了克服这些问题,科特林引入了一种新的写作方式 异步、非阻塞代码;协同程序

与线程类似,协同路由可以同时运行、等待和执行 相互沟通,了解创造它们的不同之处 比线便宜多了

还有许多其他网站和统计数据证明了这一点,即使用协同路由比使用java线程便宜得多

根据我自己的经验-我在我的公司为物流构建了一个应用程序,在运行时的某个时间点上有20多个并行运行的协同程序-在使用它们的1,5年中,我从未遇到过任何“Outomery”、“StackOverflow”或“减慢主应用程序”的问题

2.可用性/困难 与java线程相比,使用Kotlin协程非常简单,并且不会强制您改变编码方式。最后一点解释得很好

通常使用Java线程在Java中工作,人们构建了太多的“过程”或类来增加多线程的安全性,以至于在真正做好多线程之前需要了解的事情会产生很大的开销。这需要很多时间


在Kotlin中,它很简单:您不需要线程池或twerking代码来使其异步-您只需使用easy关键字
async
TL;DR-在Kotlin工作时始终使用协同程序

线程具有相对较大的内存占用—每个线程大约有1MB的VM内存。如果您为每个任务创建一个线程,那么内存可能会耗尽。相比之下,协同路由相对较小,占用了VM几KB的内存

新线程的创建相对较慢,因为它要经过操作系统。操作系统对协同程序一无所知,所以生成一个新的协同程序相对比较快

出于同样的原因,线程之间的上下文切换比挂起的协同路由之间的上下文切换要昂贵得多

此外,协同程序不太容易泄漏,这要归功于

我的问题是,如果我使用Kotlin的协同程序,它是否比线程提供更好的性能

协同程序不是线程的管理单元替代品。根本区别在于您使用的API的类型。经验法则是:

  • 阻塞API->使用线程池
  • 非阻塞(异步)API->使用协同路由

因此,如果您可以获得一个异步邮件发送API,那么一定要使用协同路由。但是,如果您被阻塞API所困扰,协同路由将不会给您带来太多价值。它们可以使从UI线程中转移阻塞操作更加方便,但无论是否使用协同路由,机制都是相同的。

您应该始终使用协同路由来管理Kotlin中的并发性

但是,如果您必须进行长时间的阻塞调用,那么无论发生什么情况,它都会阻塞线程,您应该确保它不会阻塞可能导致应用程序暂停的线程

在Kotlin中,当需要在不同或特殊的线程上运行协同程序时,可以使用“dispatcher”,这相当于线程池
Dispatchers.IO
专门用于运行长时间的阻塞I/O操作,如发送电子邮件

使用它非常简单,如下所示:

withContext(Dispatchers.IO) {
    sendEmail(...)
}

我建议使用任务队列和一个或多个工作线程来接收任务。我使用的应用程序每天发送数百万封电子邮件,只有十几个线程(这个数字只是处理峰值负载所必需的),两者都不是。这是完全错误的。使用队列和单个异步线程传递邮件。确定您的MTA是否支持批处理。@Mark我不知道Kotlin中的实现,但我假设协同路由只是一个任务队列,后台有一个线程池(UI工作和协同的上下文不同)。在这一点上,为发送几封电子邮件而付出额外的努力是相当可疑的。当然,如果这是应用程序的要点,那么您可以最小化上下文切换等,但我怀疑这有什么关系。muchAsync代码和多线程是两个完全不同的东西,真的不应该混淆。您可以混合和匹配这两个概念,但如果您想编写正确有效的代码,了解它们之间的差异非常重要。线程不是用于异步工作吗?异步IO操作正在进行时,它不会占用任何线程。