首页 > 其他分享 >RestSharp组件中止线程问题

RestSharp组件中止线程问题

时间:2023-04-13 11:55:16浏览次数:28  
标签:int Age Instance 线程 Student 组件 RestSharp s1

 

 

背景:下单流程里面,生成发货单是在独立线程池完成的,有些批发订单数据巨大,频繁拆包生成多个发货单

排查:由于ES刷新是在一个独立的api里面,一开始怀疑是异步线程频繁请求api导致中断的

  • SemaphoreSlim:对同时访问资源或资源池的线程数加以限制,结果:无效
  • lock:顺序执行,使线程等待,结果:无效
  • 日记调试:在api里面打上日记,发现中止线程的时候根本没有进入api,现在基本可以断定是调用端的问题
    查看调用端代码
// 改造前
//var client = new RestClient($"{ElasticsearchBaseApi}/api/Elasticsearch/UpdateElasticsearchOrder");
//var resp = client.Execute(request);

// 改造后(使用单例/静态变量)
var resp = client.Execute(request);

发现该项目好多地方都习惯是直接new一个RestClient来使用,正常业务量不大的时候是没问题的,如果业务量大了这里就会导致线程数过高最终导致线程中止

延伸:静态变量与单例

静态变量:众所周知静态变量只会初始化一次,声明时开辟内存空间知道程序结束,所有单例共享该空间
单例:所有实例指针地址都是同一个,是同一块内存空间
测试:

using System;

namespace ERP.JK.Util
{
    class Student
    {
        private static Student _Instance;
        public static Student Instance
        {
            get
            {
                if (_Instance==null)
                {
                    _Instance = new Student();
                }
                return _Instance;
            }
        }
        public int Age;
    }
    class Program
    {
        private static Student student = new Student();
        private static Student student2 = new Student();
        static void Main(string[] args)
        {
            try
            {
                Student s1 = Student.Instance;
                s1.Age = 10;
                unsafe
                {
                    fixed (int* p = &s1.Age)
                    {
                        Console.WriteLine("Address:0x{0:x},value:{1}", (int)p,s1.Age);
                    }
                }
                Student s2 = Student.Instance;
                s1.Age = 20;
                unsafe
                {
                    fixed (int* p = &s2.Age)
                    {
                        Console.WriteLine("Address:0x{0:x},value:{1}", (int)p, s2.Age);
                    }
                }

                student.Age = 30;
                unsafe
                {
                    fixed (int* p = &student.Age)
                    {
                        Console.WriteLine("Address:0x{0:x},value:{1}", (int)p, student.Age);
                    }
                }

                student2.Age = 40;
                unsafe
                {
                    fixed (int* p = &student2.Age)
                    {
                        Console.WriteLine("Address:0x{0:x},value:{1}", (int)p, student2.Age);
                    }
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}

运行结果:

  • 可以看出s1,s2里面的Aage地址都是一样的
  • student 与student2 因为分别实例并且存储在静态变量中,所以地址不一样

标签:int,Age,Instance,线程,Student,组件,RestSharp,s1
From: https://www.cnblogs.com/BOSET/p/17314163.html

相关文章

  • Python爬虫之多线程加快爬取速度
    之前我们学习了动态翻页我们实现了网页的动态的分页,此时我们可以爬取所有的公开信息了,经过几十个小时的不懈努力,一共获取了16万+条数据,但是软件的效率实在是有点低了,看了下获取10万条数据的时间超过了56个小时,平均每分钟才获取30条数据。注:软件运行的环境的虚拟主机,CPU:......
  • vue中父子组件调用之头像更新
    问题描述:修改图像的功能,要实现的功能是这样的:点击确认按钮,然后连带着上面的头像也更新,是不是很简单,只需要一个刷新就行,但是事实上没这么简单,因为我的这个项目涉及到三个组件 这里面中间是一个子路由,然后上面是一个组件,左边是一个组件  然后这个就涉及到子父组件传值,这......
  • 界面组件Telerik ASP.NET MVC使用指南 - 如何自定义网格过滤
    TelerikUIforASP.NETMVC拥有使用JavaScript和HTML5构建网站和移动应用所需的70+UI部件,来满足开发者的各种需求,提供无语伦比的开发性能和用户体验。它主要是针对专业级的ASP.NET开发,通过该产品的强大功能,开发者可以开发出功能丰富、适应标准广泛的响应式应用程序。在上文中(......
  • Python终止线程的方法
    亲测使用如下方法有效,但是如果线程中涉及获取释放锁,可能会导致死锁。def_async_raise(tid,exctype):"""线程退出,这种方法是强制杀死线程,但是如果线程中涉及获取释放锁,可能会导致死锁。:paramtid:threadid:paramexctype:https://docs.python.org/zh-c......
  • 组件公共状态管理react-redux
    知乎日报项目中,公共状态使用了redux和react-redux,记录学习的知识redux工程化其实就是按模块划分,在开发中能更好的理解和维护,因此该项目将状态管理划分为如下的模块:store用作存放状态管理的文件夹action是store中数据的来源,actions文件夹用来管理派发行为对象的,index......
  • spring事务里面开启线程插入,报错了是否会回滚?
    1.前言一道非常有意思的面试题目。大概是这样子的,如果在一个事务中,开启线程进行插入更新等操作,如果报错了,事务是否会进行回滚2.代码示例1@RequestMapping("/test/publish/submit")publicStringtestPublish1(){ log.info("start..."); transactionTemplate.execute(new......
  • 多线程应用案例
    需求解析一个Excel中多个sheet的数据,那么此时就可以考虑使用多线程,每个线程解析一个sheet中的数据,然后等待所有的sheet数据解析完成后,再把数据入库在这个需求中,要实现主线程等待所有现场完成shee数据解析操作,第一种方案:采用join()方法publicclassMyJoinTest{publicstaticvoid......
  • Vue.js 两个新的生命周期钩子(路由组件独有)
    视频11.两个新的生命周期钩子作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。具体名字:activated路由组件被激活时触发。deactivated路由组件失活时触发。>Home.vueNews.vuecomponentsBanner.vue<template> <divclass="col-xs-offset-2col-xs-8"> ......
  • threading多线程使用
    当我们调用某段代码时需要等待一段时间后才能进行后续的操作,而这期间计算资源并未占满,这就浪费了CPU的资源和时间,此时可以采用多线程进行并行计算。如当我们使用爬虫爬取网络资源时,某个资源的爬取过程由于网络因素需要等待,而后续的资源清洗和整合等需要等待,此时可以将资源分多份......
  • java多线程 - 狂神
    多线程实现方法第一种方法:Thread自定义线程类继承Thread类重写run()方法,编写线程执行体创建线程对象,调用start()方法启动线程注意:线程不一定立即执行,由CPU安排调度继承Thread类创建多线程packagecom.waves.dxcdemo;​importjava.text.DateFormat;importja......