首页 > 其他分享 >记一个并发规则验证实现

记一个并发规则验证实现

时间:2022-12-09 19:23:35浏览次数:39  
标签:par 验证 await 并发 Channel Result 规则 var channel

  最近在做一个简单的风控,其中有一块需求是这样的,当主请求参数到达后,会根据这些参数,看调起几个并发规则,这些规则各自有自己的验证逻辑,每个规则执行时间长短都不确定,当规则 执行完后,返回主请求,主请求根据规则验证返回结果,从而决定是否立即response请求,但其他后到的规则 ,要继续完成后面验证,以得到验证结果,以备后用。

  初步的.net代码是这样实现的:

using System.Threading.Channels;

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/test", async () =>
{
    Console.WriteLine($"开始时间 {DateTime.Now.ToString("HH:mm:ss")}");
    var channels = new List<Channel<Parameter>>();
    var len = 5;
    //创建Channel,并关联ReadAsync方法
    for (int i = 0; i < len; i++)
    {
        var channel = Channel.CreateUnbounded<Parameter>(new UnboundedChannelOptions() { AllowSynchronousContinuations = true });
        channels.Add(channel);
        await Task.Factory.StartNew(async () =>
        {
            Console.WriteLine($"Task {i}");
            await ReadAsync(channel);
        });
    }
    //向Channel发送信息
    for (int i = 0; i < channels.Count; i++)
    {
        var channel = channels[i];
        await channel.Writer.WriteAsync(new Parameter { I = i });
        Console.WriteLine($"Write {i}");
    }

    //读取返回Channel,如果有返回True,API提前返回,留下的Channel给RemainingReadAsync执行
    for (int i = 0; i < channels.Count; i++)
    {
        var channel = channels[i];
        if (channel != null && await channel.Reader.WaitToReadAsync())
        {
            if (channel.Reader.TryRead(out var par))
            {
                if(par.Result)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                }
                Console.WriteLine($"I:{par.I},Result:{par.Result},{DateTime.Now.ToString("HH:mm:ss")}");
                Console.ResetColor();
                if (par.Result)
                {
                    //把剩会的推到一个线程中执行
                    for (var r = i + 1; r < channels.Count; r++)
                    {
                        await Task.Factory.StartNew(async () =>
                        {
                            await RemainingReadAsync(channels[r]);
                        });
                    }
                    return TypedResults.Ok($"完成,有,{DateTime.Now.ToString("HH:mm:ss")}");

                }
            }
        }
    }
    return TypedResults.Ok($"完成,没有,{DateTime.Now.ToString("HH:mm:ss")}");
});

app.Run();
//处理剩余Channelr方法
async Task RemainingReadAsync(Channel<Parameter> channel)
{
    if (channel != null && await channel.Reader.WaitToReadAsync())
    {
        if (channel.Reader.TryRead(out var par))
        {
            Console.WriteLine($"I:{par.I},Result:{par.Result},{DateTime.Now.ToString("HH:mm:ss")}");
        }
    }
}
//读取Channel的方法
async Task ReadAsync(Channel<Parameter> channel)
{
    if (channel != null && await channel.Reader.WaitToReadAsync())
    {
        if (channel.Reader.TryRead(out var par))
        {
            await Task.Delay((par.I + 1) * 1000);
            if (par.I == 2)
            {
                par.Result = true;
            }
            else
            {
                par.Result = false;
            }
            await channel.Writer.WriteAsync(par);
        }
    }
}

//参数
class Parameter
{
    public int I { get; set; }
    public bool Result { get; set; }
}

  下图是执行结果,当五个任务并发调起后,并发写入数据,执行中,第三个满足条件,于21:59:13返回请求,但后续的两个,依然保证完成。

   这个Demo只是简单的完成了逻辑,关于性能还有待进一步测试验证改进。

  想要更快更方便的了解相关知识,可以关注微信公众号 

标签:par,验证,await,并发,Channel,Result,规则,var,channel
From: https://www.cnblogs.com/axzxs2001/p/16969783.html

相关文章

  • 记一个并发规则验证实现
    最近在做一个简单的风控,其中有一块需求是这样的,当主请求参数到达后,会根据这些参数,看调起几个并发规则,这些规则各自有自己的验证逻辑,每个规则执行时间长短都不确定,当规......
  • selenium获取验证码截图
    获取验证码截图代码:获取验证码代码:#!/user/bin/envpython3#-*-coding:utf-8-*-importrequestsfromseleniumimportwebdriverfromselenium.webdriver.co......
  • proteus中验证串联电阻分压、并联电阻分流
    电阻:(resistor)符号:单位:mn(毫欧),n(欧),kn(千欧),mn(兆欧),特点:串联电阻分压,并联电阻限流(1)验证串联电阻分压。首先打开proteus软件,在元器件库中找出一个4,7K的电阻和一个10K的电阻。然......
  • 并发编程总结
    ​​深入理解Java类型信息(Class对象)与反射机制​​​​深入理解Java枚举类型(enum)​​​​深入理解Java注解类型(@Annotation)​​​​深入理解Java类加载器(ClassLoader......
  • 【分享】Python 多缺口滑块验证demo
    <table><tr><tdbgcolor=orange>本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代......
  • Vue滑块验证
    登陆时加入滑块验证1、在src\components新建SilderVerify\index.vue文件<template><divclass="silder-range":class="rangeStatus?'success':''"><i@mousedo......
  • dwr笔记二之经典用法之和spring结合+验证用户是否存在
    springmvc+DWR验证用户名是否存在,是最经典的案例了.1在DWR2里,注意配置的类名跟DWR1不同了由uk.ltd.getahead变成了org.directwebremoting。换上了新的配置1<ser......
  • Response_验证码_点击切换以及ServletContext_概述
    Response_验证码_点击切换分析:点击链接或者图片,需要换一张1.给超链接和图片绑定单击事件2.重新设置图片的src属性值register.html<!DOCTYPEhtml><htmllang......
  • 为什么您的企业网络需要双因素身份验证!
    自互联网走进我们的生活以来,密码无论在生活和工作当中都充当着敏感数据信息的守护者。但如今尽管密码可能仍被很多企业所使用,但如果不对其进行改善,它已不能阻挡日益猖獗的网......
  • Java8 遍历List 使用stream().parallel()并发安全
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......