首页 > 其他分享 >Natasha API-预热(三)

Natasha API-预热(三)

时间:2023-04-20 16:33:09浏览次数:47  
标签:Preheating 预热 assembly 函数 回调 API 引用 asmName Natasha

NatashaInitializer.Preheating 预热方法

首次使用Natasha时都需要进行初始化操作,其中该方法还可以加入一个回调函数作为参数,该回调函数主要作用为减少程序集引用文件的加载,可以有效的控制内存涨幅

  • 通过判断Preheating方法中回调函数的第二个参数,可以有选择性的加载哪一类

    // 可以通过声明哪一些包不需要引用,例如Drawing,Xml等
    // 该变量的数值应该为某一部分的包,如果写System,所有包含System的都无法引用,例如System;System.Linq等
    List<String> noLoadDlls = new List<String>() { 
        "Drawing","Xml"
    };
    // 第二个参数为系统添加的dll名称
    // 当返回值为true时为排除该引用
    // 当返回值为false时为添加该引用
    NatashaManagement.Preheating((asName, name) => {
        if (!String.IsNullOrEmpty(name)) {
            // 判断noLoadDlls中是否存在符合参数二的数据
            // 如果有则返回noLoadDlls中的数据,否则返回空字符串
            // 将判断的字符串都变为小写或大写,这样就不会出现大小写判断的问题了
            var bReturn = noLoadDlls.Where(dll => name.ToLower().Contains(dll.ToLower())).ToList().FirstOrDefault("");
            return !String.IsNullOrEmpty(bReturn);
        }
        return false;
    });
    
  • Preheating方法中回调函数的第一个参数为AssemblyName,主要判断程序集版本号,程序集名称等

    AssemblyName中的Name就是回调函数中的第二个参数,单独拿出来的目的感觉主要还是对比名称

    // 排除 dapper 主版本号为 12 的程序集引用文件
    NatashaInitializer.Preheating((asmName, name) => {
        if (asmName.Name != null)
        {
            if (asmName.Name.Contains("Dapper") && asmName.Version!.Major > 12)
            {
                return true;
            }
        }
        return false;
    });
    
  • Preheating主要干了什么

    • 如果有回调函数,则赋值给DefaultUsing.SetDefaultUsingFilter和NatashaDomain.SetDefaultAssemblyFilter,让回调函数一直有效

    • 获取所有系统引用,回调函数,判断是否有手动排除引用的

      • 使用DependencyContext.Default.CompileLibraries 获取CLR中的所有库

      • 其中AssemblyName.GetAssemblyName的作用为将文件转换为程序集

        // DependencyContext.Default.CompileLibraries获取CLR中的所有库
        IEnumerable<string>? paths = DependencyContext
                 .Default
             	 // cl.ResolveReferencePaths 获得的应为绝对路径
                 .CompileLibraries.SelectMany(cl => cl.ResolveReferencePaths().Where(asmPath =>
                 {
                     //将文件转换为程序集
                    var asmName = AssemblyName.GetAssemblyName(asmPath);
                     // Preheating的回调函数
                    return !excludeReferencesFunc(asmName, asmName.Name);
                 }));
        
    • 将排除后的都添加到Natasha中

      // 1. 通过Path.GetFileNameWithoutExtension获得文件名
      // 2. 把获得的文件名与文件的绝对地址关联起来
      var resolver = new PathAssemblyResolver(paths);
      // 检查目的而加载的 Type 对象的封闭范围
      // 参见:https://learn.microsoft.com/zh-cn/dotnet/api/system.reflection.metadataloadcontext?source=recommendations&view=dotnet-plat-ext-7.0
      using (var mlc = new MetadataLoadContext(resolver))
      {
          // 并发
      	var result = Parallel.ForEach(paths, (path) =>
      	{
              Assembly assembly = mlc.LoadFromAssemblyPath(path);
              // 添加资源
              NatashaReferenceDomain.DefaultDomain.References.AddReference(assembly.GetName(), path);
              DefaultUsing.AddUsingWithoutCheck(assembly);
              // 将该类放到缓存中
              NatashaDomain.AddAssemblyToDefaultCache(assembly);
          });
          // 如果加载项一直没完成,则一直等待中
          while (!result.IsCompleted)
          {
          	Thread.Sleep(100);
          }
      }
      
    • 创建了一个Supperess为CS8019的配置实例,然后测试了一下,没问题就结束了

    • 有问题,那Preheating初始化会失败

    • 结束

  • 移除了不需要的包,如果想额外的添加类或dll

    // 第一个方法必不可少
    NatashaInitializer.Preheating();
    // 1.增加全局的 Using 引用
    NatashaManagement.AddGlobalUsing("System.IO");
    // 2.向全局引用中增加类型对应的元数据
    // 如果需要Natasha 自动覆盖全部引用,请引入 'DotNetCore.Compile.Environment' 包.
    NatashaManagement.AddGlobalReference(typeof(int));
    // 3.直接追加程序集到全局引用中
    //  path为dll文件的绝对路径
    Assembly assembly = mlc.LoadFromAssemblyPath(path);
    NatashaReferenceDomain.DefaultDomain.References.AddReference(assembly);
    

标签:Preheating,预热,assembly,函数,回调,API,引用,asmName,Natasha
From: https://www.cnblogs.com/wanghun315/p/17337315.html

相关文章

  • ArcGIS API for JavaScript 4.x加载GeoServer发布的WMTS服务
    前言 以前用OpenLayers加载GeoServer我记得很简单,现在用ArcGISAPI加载捣鼓了一天没搞好,第二天早上来参考一篇文章搞好了,我这纯属记录下。背景 客户没有ArcGISServer的许可,所以就只能用GeoServer发布或者离线切片,先研究下GeoServer,后面如果心情好再研究下离线切片。......
  • 更新整理了一大波热门免费可用的API大全
    AI智能AI绘画:通过AI生成绝美图片,包括图生文、文生图、人像照片转动漫、图片高清化等。人脸检测:快速检测图片中的人脸并返回人脸位置,输出人脸关键点坐标,支持识别多张人脸。静态活体检测:静态活体检测主要用于针对用户上传图像,返回该图像中的人脸是否为真人;基于图片中人像的破......
  • 每个节点上的cadvisor采集数据后通过aggregate api将转换交给 metric-server
    metric-server主要用来通过aggregateapi向其它组件(kube-scheduler、HorizontalPodAutoscaler、Kubernetes集群客户端等)提供集群中的pod和node的cpu和memory的监控指标,弹性伸缩中的podautoscaler就是通过调用这个接口来查看pod的当前资源使用量来进行pod的扩缩容的。需要注意的是......
  • Ubuntu部署FastApi项目
    环境介绍系统:Ubuntu22.04Pyhton版本:3.8.10Fastapi版本:0.95.0Gunicorn版本:20.1.0准备工作1.ssh连接工具(本例使用基于Windows的Linux子系统中的ssh工具)2.配置nginx代理服务器3.配置GunicornWSGIHTTP服务器一、SSH连接Ubuntu服务器sshusername@hostusername......
  • 开发者必读!常用的二维码生成器 API 推荐
    引言二维码是一种能够存储信息的图形码,它在现代社会中扮演着越来越重要的角色。生成二维码的过程通常需要使用二维码生成器,而现在有很多二维码生成器API可以供开发者使用。在本文中,我们将讨论二维码生成器API的工作原理、应用场景,并且给大家介绍一些常用的二维码生成器API,......
  • 云原生2.0网关API标准发展趋势
    摘要:GatewayAPI希望取代IngressAPI。本文分享自华为云社区《云原生2.0网关API标准发展趋势》,作者:华为云云原生团队。云原生网关API标准背景及发展现状GatewayAPI是一个开源的API标准,源自KubernetesSIG-NETWORK兴趣组。从出身角度讲,可谓根正苗红,自从开源以来备受关注,被寄予......
  • apisix网关安装部署文档
    apisix网关安装部署文档1. apisix网关简介及官方文档apisix简介:Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。我们可以使......
  • 3-常用API
    第一章Date类1.1Date概述java.util.Date`类表示特定的瞬间,精确到毫秒。继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数publicDate():从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以......
  • Java基础知识点API之System
    一:System的介绍总的来说,System类提供了一些与系统相关的方法二:System类的常见方法publicstaticvoidexit(intstatus)终止当前运行的虚拟机publicstaticvoidlongcurrentTimeMil(isc)返回当前系统的时间毫秒值形式publicstaticvoidgc()运行垃圾回收器publicstaticString......
  • k8s api
    kubectldescribesecretdashboard-admin-token-s2k99-nkube-systemcurl--cacert/etc/kubernetes/ssl/k8s-root-ca.pem-H"Authorization:BearereyJh94Xy44BpIMJYX1-FygIomSoOAdvi85WTaLLsy"https://00.100.85.167:6443{"paths":[&quo......