小5聊通过Task例子来简单理解下串行和并行如何节省执行时间

Posted 小5聊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小5聊通过Task例子来简单理解下串行和并行如何节省执行时间相关的知识,希望对你有一定的参考价值。

串行和并行的使用,一般会在什么场景下使用呢

串行,按顺序执行,并行,同时执行

1、假设如下场景

假设有一个注册业务流程,如下

第一步:完成注册功能

第二步:向公众号管理员发送一条新用户注册通知功能,

第三步,向邀请者发送成功邀请信息

第四步,向被邀请者发送成功注册信息

如果按顺序执行,那么肯定需要等上一步操作完成才能执行下一步代码执行的时间就是所有功能完成后的时间

如果是功能并行执行呢,那么这样是否会节省一点时间,特别是对于高并发来说,答案是肯定的,当然注册成功与否肯定是与其他三个功能属于串行关系,必须成功注册才会发起其他三个功能

2、 并行方式

功能自上而下按顺序执行

  • 耗时4秒

通过下面方式可以知道,假如4个功能同时执行完成后,再响应到用户,那么用户体验就是4s秒才能看到自己是否注册成功,这在实际场景肯定是不可行的

  •  代码如下
var recordTime = System.Diagnostics.Stopwatch.StartNew();

var t1 = Task.Run(() =>

    Console.WriteLine("1、开始注册");
    Task.Delay(1000).Wait();
    Console.WriteLine("1、完成注册");
);
t1.Wait();

var t2 = Task.Run(() =>

    Console.WriteLine("2、开始向管理员发送消息");
    Task.Delay(1000).Wait();
    Console.WriteLine("2、完成向管理员发送消息");
);
t2.Wait();
var t3 = Task.Run(() =>

    Console.WriteLine("3、开始向邀请者发送消息");
    Task.Delay(1000).Wait();
    Console.WriteLine("3、完成向邀请者发送消息");
);
t3.Wait();

var t4 = Task.Run(() =>

    Console.WriteLine("4、开始向被邀请者发送消息");
    Task.Delay(1000).Wait();
    Console.WriteLine("4、完成向被邀请者发送消息");
);
t4.Wait();

//Task.WaitAll(t1, t2, t3);
recordTime.Stop();
Console.WriteLine($"\\r\\n===所有功能均完成,耗时:recordTime.Elapsed.ToString("ss")s===");
Console.ReadLine();

3、并行方式

功能同样也是自上而下执行,但是无需等待某个task任务方法体内的代码是否执行完成

  • 并行且等待,耗时2秒

Task.WaitAll(t1, t2, t3, t4);
  • 并行不等待,耗时1秒

虽然t2/t3/t4任务还在执行,但是已经在1秒后响应告诉了用户,你已经完成了注册

 

【总结】

这里仅仅是简单举例,实际场景还可能会出现,如果发送消息不成功或者方法体内报错了,那么这个时候又需要考虑那些情况。

为什么会举这样一个例子,其实也是为了后续深入了解高并发消息队列的场景使用

以上是关于小5聊通过Task例子来简单理解下串行和并行如何节省执行时间的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 坑 多个task是串行执行还是并行的

AsyncTask 坑 多个task是串行执行还是并行的

Python并行编程——multiprocessing

小5聊C#基础之内置和自定义委托的简单使用

spring定时任务(scheduler)的串行并行执行

svtask内是并行还是串行