美文网首页ASP.NET Core
同步 异步 多线程

同步 异步 多线程

作者: GongZH丶 | 来源:发表于2018-05-29 21:36 被阅读16次

https://www.cnblogs.com/vipyoumay/p/7487389.html

同步 是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;

异步 是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞 是指IO操作需要彻底完成后才返回到用户空间;

非阻塞 是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

同步阻塞I/O

同步阻塞I/O模型是最简单的I/O模型,用户进程在进行I/O操作时被阻塞,如下图所示: 1.png
        [HttpGet("test")]
        public IActionResult Test()
        {
            var start = DateTime.Now;
            Add();
            return Json("start:" + start + "||| end:" + DateTime.Now);
        }
        public void Add()
        {
            Thread.Sleep(3000);
        }
01.PNG

同步非阻塞I/O

在同步非阻塞整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。


2.png

在ASP.NET Core 中可以使用多线程来实现同步非阻塞,在如下代码中可以看到,使用多线程调用一个会自动休眠3秒的方法,主线程Sync会先返回值,而不会阻塞。

        [HttpGet("test")]
        public IActionResult Test()
        {
            var start = DateTime.Now;
            var thread = new Thread(new ThreadStart(Add));
            return Json("start:" + start + "||| end:" + DateTime.Now);
        }
        public void Add()
        {
            Thread.Sleep(3000);
        }
02.PNG

异步I/O

真正的异步IO需要操作系统更强的支持。在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。


3.png

如果想在同步非阻塞的情况下获得返回的数据,就需要轮询,重复的对线程请求。代码中使用while循环轮询线程。

    public IActionResult Async()
    {
        var start = DateTime.Now;
        short num = 10;
        var result = Add(num).Result;
        return Json("start:"+ start +" end: " +  DateTime.Now + " ||| result: " + result);
    }

    async Task<short> Add(short num)
    {
        await Task.Delay(2000);
        return ++num;
    }
03.PNG
同步与异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

  • 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
阻塞与非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  • 你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

相关文章

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

  • 多线程相关面试问题

    多线程:GCD、NSOperation、NSThread。 一、GCD 1、同步/异步 和 串行/并发(1)、同步...

  • 一、多线程基础

    多线程基础 基本概念 同步、异步 同步 线程B要等待线程A的执行结果之后才能执行。要顺序执行 异步 相对同步来说,...

  • iOS面试之多线程模块

    多线程 多线程内容如下: GCD NSOperation NSThread 多线程与锁 1.GCD 同步/异步和串...

  • Java异步编程 1

    异步,相比同步执行来说。 早期的异步,可以通过多线程来完成。 例子1

  • iOS - Multi-Thread

    概念篇 进程 线程 多线程 单核多线程 & 多核多线程 并行 & 并发 同步 & 异步 队列 队列 & 任务 的执...

  • 2018-05-24-多线程学习

    java多线程并发的编程学习 1,概念的学习 同步异步:同步需要等待异步不需要,同步如对共享数据操作避免脏数据...

  • 锁与多线程同步的实现

    Java当中的锁都是为了保证多线程同步执行。如果没有锁的话,多线程是异步执行的。 什么是多线程同步? 请看下面的代...

  • iOS_2016最新版面试题(附答案)

    每天四道题,让精彩填满生活... 1、多线程同步和异步的区别。iOS如何实现多线程的同步? 答:同步就是指一个线程...

  • iOS • 记——多线程必知必会的原理概念

    多线程概念 同步 && 异步 同步:一个人依次执行多个任务异步:多个人同时执行多个任务 进程 && 线程 进程:1...

网友评论

    本文标题:同步 异步 多线程

    本文链接:https://www.haomeiwen.com/subject/fbpmjftx.html