import java.nio.channels.{AsynchronousServerSocketChannel, AsynchronousSocketChannel}
import java.net.InetSocketAddress
import scala.concurrent.{Future, blocking}
class Master {
val server: AsynchronousServerSocketChannel = AsynchronousServerSocketChannel.open()
server.bind(new InetSocketAddress("localhost", port))
val client: Future[AsynchronousSocketChannel] = Future { blocking { server.accept().get() } }
}
這是我正在嘗試的僞代碼。Scala中的異步IO(套接字)
在問這個問題之前,我搜索了一下,發現一個相關的answer。 在她的回答,我不知道這意味着什麼:"If you want to absolutely prevent additional threads from ever being created, then you ought to use an AsyncIO library, such as Java's NIO library."
因爲我不想(使用blocking
時的情況)或thread pool hell
(相反的情況),從任一running out of memory
苦,她的回答是正是我一直期待。但是,正如您在我的僞代碼中看到的那樣,由於blocking
,即使我使用了NIO,她也會爲每個客戶端創建一個新線程(爲簡單起見,我僅創建了一個客戶端)。
- 請用一個簡單的例子來解釋她的建議。
- 在Scala中嘗試異步io時,我的僞代碼是否是一種合適的方法,或者有更好的替代方法嗎?
現在我知道了。我感到困惑的是'non-blocking'和'asynchronous'之間的區別。然而,在閱讀了一些輪詢代碼之後,我改變了主意。即使消耗更多的線程,我也會選擇簡單代碼的異步方式。在這種情況下,我的僞代碼是最好的嗎? – dohki
@illuxic是的。你可以去'nio'庫的阻塞版本 – pamu
@illuxic我認爲你的代碼完成了這項工作 – pamu