如何解决Kotlin协程不适当的阻塞方法调用TCP套接字
使用套接字时,我收到此警告。我正在从IO范围协程调用startConnection方法,如果startConnection方法被挂起,则会收到警告。我将其设为暂停状态,因为稍后我会从中调用其他暂停方法。有什么办法解决还是我应该取消警告?
private suspend fun startConnection(ip: String,port: Int) {
try {
socket = Socket(ip,port)
.
.
解决方法
Socket()是IO调用。它正在建立实际的TCP连接。 实际上,“旧IO”框架中的所有调用都是阻塞调用。您需要为每个调用分配一个线程(或者可以将事情锁定一会儿没事)
协程!=线程
如果您使用Dispatch.IO,则协程==线程(很多,但对您而言是隐藏的),但是编译器不知道这是您使用的调度程序,因此您将继续遇到相同的错误。如果您100%确信协程在它自己的线程上,而不是忽略它。
一些不请自来的建议:如果您使用协程(如线程),也许最好只使用线程?使用协程似乎使您的生活更加艰难(例如此错误)。如果您使用Dispatch.IO,则无论如何都必须像线程一样同步内容。不知道是什么协程在这里买你的。
协程只是一个编译器技巧,它可以拆分代码并在您不知道的情况下从挂起调用中进行回调。我认为它们是1994年的Windows 3.1中的协作线程(旧的又是新的)。
您想使用NIO调用进入协程。异步版本更易于使用(您不必编写自己的select()循环)。或使用Netty,它始终是所有回调,然后将协程包装起来(现在必须有一个可以执行此操作的lib ...)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。