开发者社区> 问答> 正文

现代编程语言中的协程是怎样的?

现代编程语言中的协程是怎样的?

展开
收起
1358896759097293 2021-05-04 15:28:30 858 0
1 条回答
写回答
取消 提交回答
  • 45271990@qq.com

    17.png

    左边是VERT.X, Java里面最近比较流行的框架,想要制作的就是Java里的node.js的生态,我们可以看到官方所提供的连接数据库例子。 Client.getConnection,来获取数据库连接,但它不是说立马返回一个连接给到我们,而是提供callback,然后这个result里面表示执行是否成功,如果成功的话,我们可以通过result去拿到 connection。这就是通过义务编程的方式,去让我们在线程里面处理大的逻辑,NGINX就是这样的一种方式。这样代码其实看起来是非常难以维护的,比如在里面需要通过result set去把数据放到缓存里面,又是一个远程调用需要阻塞,可能又是一种callback,这个嵌套会非常深,非常难处理,由于我们都是callback,所以这个站就没法被维持,假如在这个地方有异常就非常难以处理。 现代编程语言是怎么解决这个问题,我们给的答案是协程。ES7、C# 他们都提供协程来帮助解决这类问题。我们以一段Kotlin代码为例,看协程怎么帮助代码改写成非常直观的代码,Kotlin里面通过suspend关键字来表示,函数是可以被挂起的,然后它也可以在 client上新加的方法,新的方法叫Agetconnection。里面调用Kotlin提供的非常 medical的方法,他会获取一个当前执行上下文的connection,让我们getConnection直接调用。getConnection的callback是恢复当前协程的执行,并且把拿到connection作为返回值。这样实际上不用一直占着 CPU资源,实际上调度器会继续去调度其他执行,一旦进行这类封装以后,我们看到代码可以被简化为下面这种形式。

    Conn=clinet. AGetConnection();
    然后 rs= Conn .aQurerythat(“SELECT * FROM ...”)
    
    

    这段代码相比左边这段代码那就是大大简化了,但我们要做对这种回调形式进行封装。

    2021-05-05 22:56:43
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Swoole2.0原生协程高性能开发实践 立即下载
多线程 立即下载
JavaScript异步编程 立即下载