async/await + Java NIO

chunquedong · · 800 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

虽然Java官方有loom项目来实现协程,但是实在等不住了。既然fanx支持async/await,所以就尝试和异步IO结合,来实现高性能网络框架。

代码见这里:fanx-dev/fanxServer

架构类似于netty的reactor模式,像这样:

示例代码:

class TestServer : Handler {

  override async Void onService(Socket socket) {
    buf := NioBuf.makeMem(1024)
    n := await socket.read(buf, 1)
    buf.flip()
    echo("=====server receive: $buf: "+buf.readAllStr)

    buf.clear
    buf.printLine("HelloWorld")
    buf.flip
    n2 := await socket.write(buf)
    echo("=====send: "+n2)
  }

  static Void main() {
    Server {
      port = 8080
      handler = TestServer#
    }.start
  }
}

代码中,当运行到await的时候当前任务暂停,并交给selector线程去监听IO事件,当前线程没有阻塞而是去继续处理其他连接任务。当selector发现事件就绪后通知恢复运行任务。由于采用线程池机制await前后可能运行在不同的线程中。

是不是代码看起来比netty的回调好多了。

支持基本的Http协议:

class HttpTestServer : HttpHandler {

  override async Void onHttpService(HttpReq req, HttpRes res) {
    echo("Server receive: "+req.headers)
    res.headers["Content-Type"] = "text/html; charset=utf-8"

    buf := NioBuf.makeMem(1024)
    buf.printLine("<html>
                        <body>Hello World</body>
                       </html>")
    buf.flip
    //await res.writeFixed(buf)
    await res.writeChunk(buf)
  }

  static Void main() {
    Server {
      port = 8080
      handler = HttpTestServer#
    }.start
  }
}

性能方面没有测试,估计肯定比阻塞IO好。

Java基于协程的IO框架还可以使用kilim,本项目也参考了kilim的代码。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:chunquedong

查看原文:async/await + Java NIO

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

800 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传