前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于事件驱动的并发编程

基于事件驱动的并发编程

作者头像
高广超
发布2018-12-12 09:47:46
6320
发布2018-12-12 09:47:46
举报
文章被收录于专栏:互联网技术栈互联网技术栈
  • 同步与异步
    • 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
    • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
    • 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
  • 阻塞与非阻塞
    • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
    • 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
  • 一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
    • 同步阻塞IO:
      • 在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!
    • 同步非阻塞IO:
      • 在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
    • 异步阻塞IO:
      • 此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时(通知)是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(就绪的没有就绪的都有监听,epoll是select的替代方式,只监听就绪的文件句柄),从而提高系统的并发性!
    • 异步非阻塞IO:
      • 在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。
  • 异步事件驱动
    • 如果我们的业务逻辑处理使用异步事件驱动(Reactor)的方式,而又需要在本次请求中需要返回请求结果,此时属于同步获取返回值,因此此时我们只能使用阻塞异步或者“并发”“同步”的方式。
    • 如果该次请求不需要同步获取返回值,此时我们即可使用阻塞异步(Reactor)方式,也可以结合使用DeferredResult异步结果返回。image.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.04.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档