我正在学习异步运行时并尝试编写运行时和 TcpStream 的异步版本。
我已经完成了
accept()
、write()
和read()
,只需调用std::TcpStream
的相应函数并处理Error:WouldBlocking
错误(将其注册到Event-Poller上)。
但是,我不知道如何实施
connect()
。对于前面的功能,已经有一个 TcpStream
,如果待处理,我可以在事件轮询器上注册它。但对于connect()
来说,如果std::TcpStream::connect()
待定,则不存在这样的TcpStream。因为它将 socket(2)
和 connect(2)
合并在里面。
我查看了
Async::connect()
crate中async-io
的源代码,它针对不同的操作系统直接调用低级函数(例如socket(2)、connect(2))。我是否必须做同样的事情(我不想做)?
这是您在这里为自己设定的一项艰巨的任务。
async-io
和 tokio
受欢迎是有原因的;自己写这些东西既乏味又容易出错。
您可能知道异步是如何工作的,您知道轮询套接字并返回“Poll::Pending”并不难。困难的部分是检测套接字不再挂起并且可以再次轮询。
通常有两种方法:
第二种解决方案高度依赖平台,但性能应该更好;这就是为什么
async-io
和类似的人选择这条道路。
如果您只是将其用作编程练习并且不需要高性能,那么第一个解决方案可能是您应该选择的解决方案:
futures-channel
或crossbeam
spawn_blocking
的机制。始终确保您不会从异步任务中调用阻塞函数。祝你好运!