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


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

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

    1、假设如下场景

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

    第一步:完成注册功能

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

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

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

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

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

    2、 并行方式

    功能自上而下按顺序执行

    • 耗时4秒

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

    •  代码如下
    1. var recordTime = System.Diagnostics.Stopwatch.StartNew();
    2. var t1 = Task.Run(() =>
    3. {
    4. Console.WriteLine("1、开始注册");
    5. Task.Delay(1000).Wait();
    6. Console.WriteLine("1、完成注册");
    7. });
    8. t1.Wait();
    9. var t2 = Task.Run(() =>
    10. {
    11. Console.WriteLine("2、开始向管理员发送消息");
    12. Task.Delay(1000).Wait();
    13. Console.WriteLine("2、完成向管理员发送消息");
    14. });
    15. t2.Wait();
    16. var t3 = Task.Run(() =>
    17. {
    18. Console.WriteLine("3、开始向邀请者发送消息");
    19. Task.Delay(1000).Wait();
    20. Console.WriteLine("3、完成向邀请者发送消息");
    21. });
    22. t3.Wait();
    23. var t4 = Task.Run(() =>
    24. {
    25. Console.WriteLine("4、开始向被邀请者发送消息");
    26. Task.Delay(1000).Wait();
    27. Console.WriteLine("4、完成向被邀请者发送消息");
    28. });
    29. t4.Wait();
    30. //Task.WaitAll(t1, t2, t3);
    31. recordTime.Stop();
    32. Console.WriteLine($"\r\n===所有功能均完成,耗时:{recordTime.Elapsed.ToString("ss")}s===");
    33. Console.ReadLine();

    3、并行方式

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

    • 并行且等待,耗时2秒

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

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

     

    【总结】

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

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

  • 相关阅读:
    【Redis】Redis中使用Lua脚本
    MYSQL 双表联合查询,通过A表数组查询B表对应的数据
    报表工具使用之FineReport大数据集导出插件
    图扑软件智慧风电:数字孪生 3D 风机智能设备运维
    Sublime合并生成,同时编辑三页代码和文本框
    算法 - 递归实现汉诺塔(The Tower of Hanoi)
    实战PyQt5:149-QChart图表之图例设置
    【2022最新核心面试资料 】最强Java面试八股文秋招offer召唤术!入职薪资53k
    Eureka Server 实现在线扩容
    VLC命令行实例
  • 原文地址:https://blog.csdn.net/lmy_520/article/details/125866084