尽管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的代码。