|
|
|
@ -427,7 +427,7 @@ impl SimpleFuture for SocketRead<'_> {
|
|
|
|
|
|
|
|
|
|
关于第二点,其中一个简单粗暴的方法就是使用一个新线程不停的检查 `socket` 中是否有了数据,当有了后,就调用 `wake()` 函数。该方法确实可以满足需求,但是性能着实太低了,需要为每个阻塞的 `Future` 都创建一个单独的线程!
|
|
|
|
|
|
|
|
|
|
在现实世界中,该问题往往是通过操作系统提供的 `IO` 多路复用机制来完成,例如 `Linux` 中的 **`epoll`**,`FreeBSD` 和 `MacOS` 中的 **`kqueue`** ,`Windows` 中的 **`IOCP`**, `Fuchisa`中的 **`ports`** 等(可以通过 Rust 的跨平台包 `mio` 来使用它们)。借助IO多路复用机制,可以实现一个线程同时阻塞地去等待多个异步IO事件,一旦某个事件完成就立即退出阻塞并返回数据。相关实现类似于以下代码:
|
|
|
|
|
在现实世界中,该问题往往是通过操作系统提供的 `IO` 多路复用机制来完成,例如 `Linux` 中的 **`epoll`**,`FreeBSD` 和 `macOS` 中的 **`kqueue`** ,`Windows` 中的 **`IOCP`**, `Fuchisa`中的 **`ports`** 等(可以通过 Rust 的跨平台包 `mio` 来使用它们)。借助IO多路复用机制,可以实现一个线程同时阻塞地去等待多个异步IO事件,一旦某个事件完成就立即退出阻塞并返回数据。相关实现类似于以下代码:
|
|
|
|
|
```rust
|
|
|
|
|
struct IoBlocker {
|
|
|
|
|
/* ... */
|
|
|
|
|