C#_事件_多线程(基础)
文章目录
- 事件
- 通过事件使用委托
- 多线程(基础)
- 进程:
- 线程:
- 多线程
- 线程生命周期
- 主线程
- Thread 类中的属性和方法
- 创建线程
- 管理线程
- 销毁线程
事件
事件(Event)本质上来讲是一种特殊的多播委托,只能从声明它的类中进行调用,基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
通过事件使用委托
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件,这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。
发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _06_事件
{internal class Program{static void Main(string[] args){PublisherDome publisherDome=new PublisherDome();SubriberDome subscriberDome=new SubriberDome();publisherDome.MyEvent += new PublisherDome.Myentrust(subscriberDome.Print);publisherDome.SetValue("wuyifan");}}//定义一个发布器类public class PublisherDome{private string value;//在类的内部声明事件,首先必须先声明该事件的委托类型public delegate void Myentrust(string str);//基于上面的委托定义事件(当事件触发的时候,就会调用委托)public event Myentrust MyEvent;public void SetValue(string s){value = s;MyEvent(value);}}//订阅器类public class SubriberDome{public void Print(string str){Console.WriteLine(str);}}
}//-----------------------------------------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _07_事件
{internal class Program{static void Main(string[] args){Son s=new Son();s.NoMenery += () =>{Console.WriteLine("爸爸知道了");};Console.WriteLine("按下回车就表示没钱了");Console.ReadLine();s.Buy();}}class Son{public delegate void NoMeneryDelegate();public event NoMeneryDelegate NoMenery;//一个买东西的方法public void Buy(){//只要买东西没钱了,就去执行委托NoMenery?.Invoke();}}
}//-------------------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _08_事件
{internal class Program{static Action fa;static void Main(string[] args){Son s = new Son() {Name="亦凡" };Father f =new Father() {Name="亦凡的爸爸" };Mother m = new Mother() { Name = "亦凡的妈妈" };//创建爸爸给钱的事件fa = () =>{f.Buy(10);s.Money += 10;Console.WriteLine($"爸爸给了10块钱,现在还有{s.Money}");if (f.Money <= 0){s.OnNoMonery -= fa;}};s.OnNoMonery += fa;s.OnNoMonery += () =>{m.Buy(20);s.Money += 20;Console.WriteLine($"妈妈给了20块钱,现在还有{s.Money}");};s.Buy(3);s.Buy(3);s.Buy(20);s.Buy(20);s.Buy(20);}}class People{public string Name { get; set; }public int Money { get;set; }public virtual void Buy(int m){Money -= m;Console.WriteLine($"{Name}花了{m}元,现在还有{Money}元");}}class Son : People{public Son() {Money = 10;}//声明一个事件 当儿子没钱的时候触发public event Action OnNoMonery;public override void Buy(int m){base.Buy(m);if (Money<=5){OnNoMonery.Invoke();}}}class Father : People{public Father(){Money = 20;}}class Mother : People{public Mother(){Money = 200;}}}
//----------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _09_事件
{internal class Program{static void Main(string[] args){Son s = new Son() { Name = "亦凡" };Father f = new Father() { Name = "亦凡的爸爸" };Mother m = new Mother() { Name = "亦凡的妈妈" };s.OnNoMonery += m.SonNoMoney;s.OnNoMonery += f.SonNoMoney;s.Buy(3);s.Buy(3);s.Buy(20);s.Buy(20);s.Buy(20);}}class People{public string Name { get; set; }public int Money { get; set; }public virtual void Buy(int m){Money -= m;Console.WriteLine($"{Name}花了{m}元,现在还有{Money}元");}}class Son : People{public Son(){Money = 10;}//声明一个事件 当儿子没钱的时候触发public event Action<Son> OnNoMonery;public override void Buy(int m){if (Money <= m){Console.WriteLine("钱不够,去要钱");OnNoMonery.Invoke(this);}base.Buy(m);if (Money<=5){OnNoMonery.Invoke(this);}}}class Father : People{public Father(){Money = 20;}//儿子没钱执行的方法public void SonNoMoney(Son s){Buy(10);s.Money+= 10;Console.WriteLine($"爸爸给了10块钱,现在还有{s.Money}");if (Money <= 0){Console.WriteLine($"{Name}没钱了");s.OnNoMonery -= SonNoMoney;}}}class Mother : People{public Mother(){Money = 200;}public void SonNoMoney(Son s){Buy(20);s.Money += 20;Console.WriteLine($"爸爸给了10块钱,现在还有{s.Money}");}}
}
多线程(基础)
进程:
进程并不是物理的东西,是虚拟出来的,是一种概念。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。是一种计算机概念,是程序在运行的时候,记录当前程序对计算机的各种资源的消耗。
线程:
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。也是一种计算机概念,线程是进程在响应操作的时候一个最小的单元,也包括CPU/硬盘/内存等。
多线程
多线程就是多个线程同时工作的过程,我们可以将线程看作是程序的执行路径,每个线程都定义了一个独特的控制流,用来完成特定的任务。如果您的应用程序涉及到复杂且耗时的操作,那么使用多线程来执行是非常有益的。使用多线程可以节省 CPU 资源,同时提高应用程序的执行效率,例如现代操作系统对并发编程的实现就用到了多线程。到目前为止我们编写的示例程序都是单线程的应用程序,这样的应用程序一次只能执行一个任务。
线程生命周期
线程生命周期开始于我们创建 System.Threading.Thread 类对象的时候,当线程被终止或完成执行时生命周期终止。
下面列出了线程生命周期中的各种状态:
- 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况;
- 就绪状态:当线程准备好运行并等待 CPU 周期时的状况;
- 不可运行状态:下面的几种情况下线程是不可运行的:
- 已经调用 Sleep 方法;
- 已经调用 Wait 方法;
- 通过 I/O 操作阻塞。
- 死亡状态:当线程已完成执行或已中止时的状况。
主线程
在 C# 中,System.Threading.Thread 类用于处理线程,它允许在多线程应用程序中创建和访问各个线程。在多线程中执行的第一个线程称为主线程,当 C# 程序开始执行时,将自动创建主线程,而使用 Thread 类创建的线程则称为子线程,您可以使用 Thread 类的 CurrentThread 属性访问线程。
Thread th =Thread.CurrentThread;th.Name = "主线程";Console.WriteLine(th.Name);
Thread 类中的属性和方法
下表列出了 Thread 类中一些常用的属性:
属性 | 描述 |
---|---|
CurrentContext | 获取线程正在执行的上下文 |
CurrentCulture | 获取或设置当前线程的区域性 |
CurrentPrincipal | 获取或设置线程的当前负责人(对基于角色的安全性而言) |
CurrentThread | 获取当前正在运行的线程 |
CurrentUICulture | 获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源 |
ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息 |
IsAlive | 获取当前线程的执行状态 |
IsBackground | 获取或设置一个值,该值表示某个线程是否为后台线程 |
IsThreadPoolThread | 获取线程是否属于托管线程池 |
ManagedThreadId | 获取当前托管线程的唯一标识符 |
Name | 获取或设置线程的名称 |
Priority | 获取或设置线程的调度优先级 |
ThreadState | 获取当前线程的状态 |
下表列出了 Thread 类的一些常用的方法:
方法名 | 描述 |
---|---|
public void Abort() | 在调用此方法的线程上引发 ThreadAbortException,以终止此线程 |
public static LocalDataStoreSlot AllocateDataSlot() | 在所有的线程上分配未命名的数据槽,为了获得更好的性能,请改用以 ThreadStaticAttribute 特性标记的字段 |
public static LocalDataStoreSlot AllocateNamedDataSlot(string name) | 在所有线程上分配已命名的数据槽,为了获得更好的性能,请改用以 ThreadStaticAttribute 特性标记的字段 |
public static void BeginCriticalRegion() | 通知主机执行将要进入一个代码区域,在该代码区域内线程中止或未经处理的异常的影响可能会危害应用程序域中的其他任务 |
public static void BeginThreadAffinity() | 通知主机托管代码将要执行依赖于当前物理操作系统线程的标识指令 |
public static void EndCriticalRegion() | 通知主机执行将要进入一个代码区域,在该代码区域内线程中止或未经处理的异常仅影响当前任务 |
public static void EndThreadAffinity() | 通知主机托管代码已执行完依赖于当前物理操作系统线程的标识指令 |
public static void FreeNamedDataSlot(string name) | 为进程中的所有线程消除名称与数据槽之间的关联。为了获得更好的性能,请改用以 ThreadStaticAttribute 特性标记的字段 |
public static Object GetData(LocalDataStoreSlot slot) | 检索当前线程中指定的值。为了获得更好的性能,请改用以 ThreadStaticAttribute 特性标记的字段 |
public static AppDomain GetDomain() | 返回当前线程运行的域 |
public static AppDomain GetDomainID() | 返回应用程序域的唯一标识符 |
public static LocalDataStoreSlot GetNamedDataSlot(string name) | 查找已命名的数据槽。为了获得更好的性能,请改用以 ThreadStaticAttribute 特性标记的字段 |
public void Interrupt() | 中断处于 WaitSleepJoin 状态的线程 |
public void Join() | 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。此方法有不同的重载形式 |
public static void MemoryBarrier() | 按如下方式同步内存访问:执行当前线程的处理器在对指令重新排序时不能采用先执行 MemoryBarrier 调用之后的内存存取,再执行 MemoryBarrier 调用之前的内存存取的方式 |
public static void ResetAbort() | 取消为当前线程请求的 Abort |
public static void SetData(LocalDataStoreSlot slot, Object data) | 在当前正在运行的线程上的指定槽中为此线程的当前域设置数据。为了获得更好的性能,请改用以 ThreadStaticAttribute 特性标记的字段 |
public void Start() | 开始一个线程 |
public static void Sleep(int millisecondsTimeout) | 让线程暂停一段时间 |
public static void SpinWait(int iterations) | 让线程等待一段时间,时间长短由 iterations 参数定义 |
public static byte VolatileRead(ref byte address) public static double VolatileRead(ref double address) public static int VolatileRead(ref int address) public static Object VolatileRead(ref Object address) | 读取字段值。无论处理器的数目或处理器缓存状态如何,该值都是由计算机处理器写入的最新值 |
public static void VolatileWrite(ref byte address, byte value) public static void VolatileWrite(ref double address, double value) public static void VolatileWrite(ref int address, int value) public static void VolatileWrite(ref Object address, Object value) | 立即向字段中写入一个值,并使该值对计算机中的所有处理器都可见 |
public static bool Yield() | 终止当前正在调用的线程并执行另一个准备运行的线程(由操作系统选择将要执行的另一个线程) |
创建线程
C# 是通过扩展 Thread 类来创建线程的,然后使用扩展的 Thread 类调用 Start() 方法开始执行子线程。
static void Main(string[] args){ThreadStart childref = new ThreadStart(CallToChildThread);Console.WriteLine("在Main函数中创建子线程");Thread childThead = new Thread(childref);childThead.Start();}public static void CallToChildThread(){Console.WriteLine("执行子线程");}
管理线程
Thread 类提供了各种管理线程的方法,比如可以使用 sleep() 方法使线程在特定时间段内暂停,
static void Main(string[] args){ThreadStart childref = new ThreadStart(CallToChildThread);Console.WriteLine("在Main函数中创建子线程");Thread childThead = new Thread(childref);childThead.Start();}public static void CallToChildThread(){Console.WriteLine("执行子线程");Console.WriteLine("子线程暂停5秒");Thread.Sleep(5000);//毫秒Console.WriteLine("继续执行子线程");}
销毁线程
Thread 类中提供了 Abort() 方法用于销毁线程,Abort() 方法会抛出一个 threadabortexception 异常来中止线程,这个异常不能被捕获,
static void Main(string[] args){ThreadStart childref = new ThreadStart(CallToChildThread);Console.WriteLine("在Main函数中创建子线程");Thread childThead = new Thread(childref);childThead.Start();Thread.Sleep(2000);Console.WriteLine("在Main函数终止子线程");childThead.Abort();}public static void CallToChildThread(){try{Console.WriteLine("执行子线程");for (int i = 0; i <= 10; i++) {Thread.Sleep(500);Console.WriteLine(i);}Console.WriteLine("子线程执行完成");}catch (ThreadAbortException e){Console.WriteLine("线程终止"+e);}finally{Console.WriteLine("无法捕获线程异常");}}## 上期习题答案
1. 模拟ListMyList<int> myList1 = new MyList<int>(); myList1.Add(1); myList1.Add(20); 2. 自定义 ForEach FindIndex Find....
```C
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//delegate bool MyFunc<T>(T v);
//namespace _03_昨天
//{
// internal class Program
// {
// static void Main(string[] args)
// {
// int[] ints = { 1, 3, 6 };
// string[] strings = { "亦凡1", "亦凡2", "罗祥", "李迪" };
// //根据传入的数组和方法,从前往后查询,返回第一个满足条件的数据
// //Find的工作原理:循环该数组,并且每次循环调用传递的方法,并且将当前的数据通过参数传递到方法中,如果方法返回了true,则Find直接返回当前这个参数
// //参数1:查询的数组
// //参数2:一个函数,这个函数应该返回一个布尔值,表示当前数值是否满足条件
// //如果数组中没有满足条件的数组,则返回该类型的默认值
// int num= MyArray.MyFind<int>(ints, FnEven);
// Console.WriteLine(num);
// string str = MyArray.MyFind(strings, FnWu);
// Console.WriteLine(str);// }
// public static bool FnEven(int v)
// {
// return v % 2 == 0;
// }
// public static bool FnWu(string v)
// {
// return v.StartsWith("吴");
// }// }// class MyArray
// {
// public static T MyFind<T>(T[] arr, MyFunc<T> fn)
// {
// for (int i = 0; i < arr.Length; i++)
// {
// if (fn(arr[i]))
// {
// return arr[i];
// }
// }
// return default(T);
// }
// }
//}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//delegate bool MyFunc<T>(T v);
namespace _03_昨天
{internal class Program{static void Main(string[] args){int[] ints = { 1, 3, 6 };string[] strings = { "亦凡1", "亦凡2", "志祥", "云迪" };//根据传入的数组和方法,从前往后查询,返回第一个满足条件的数据//Find的工作原理:循环该数组,并且每次循环调用传递的方法,并且将当前的数据通过参数传递到方法中,如果方法返回了true,则Find直接返回当前这个参数//参数1:查询的数组//参数2:一个函数,这个函数应该返回一个布尔值,表示当前数值是否满足条件//如果数组中没有满足条件的数组,则返回该类型的默认值int num = MyArray.MyFind(ints,v=>v%2==0);Console.WriteLine(num);string str = MyArray.MyFind(strings, FnWu);Console.WriteLine(str);MyArray.MyForEach(ints, (v,i) =>{Console.WriteLine($"v=={v}");Console.WriteLine($"i=={i}");});}public static bool FnEven(int v){return v % 2 == 0;}public static bool FnWu(string v){return v.StartsWith("吴");}}class MyArray{public static T MyFind<T>(T[] arr, Func<T,bool> fn){for (int i = 0; i < arr.Length; i++){if (fn(arr[i]))return arr[i];}return default(T);}public static void MyForEach<T>(T[]arr,Action<T,int> fn){for (int i = 0; i < arr.Length; i++){fn(arr[i],i);}}}
}
觉得本篇文章写的还不错可以点赞,收藏,关注。主页有21天速通C#教程欢迎订阅!!!
相关文章:
C#_事件_多线程(基础)
文章目录 事件通过事件使用委托 多线程(基础)进程:线程: 多线程线程生命周期主线程Thread 类中的属性和方法创建线程管理线程销毁线程 事件 事件(Event)本质上来讲是一种特殊的多播委托,只能从声明它的类中进行调用,基本上说是一个用户操作&…...
vue 通过插槽来分配内容
通过插槽来分配内容 一些情况下我们会希望能和 HTML 元素一样向组件中传递内容: <AlertBox>Something bad happened. </AlertBox> 这可以通过 Vue 的自定义 <slot> 元素来实现: <template><div class"alert-box&quo…...
YOLO图像前处理及格式转换
import cv2 import numpy as np import os import glob# 数据增强函数 def augment_data(img):rows,cols,_ img.shape# 水平翻转图像if np.random.random() > 0.5:img cv2.flip(img, 1)img_name os.path.splitext(save_path)[0] "_flip.png"cv2.imwrite(img_n…...
ES6 学习(二)-- 字符串/数组/对象/函数扩展
文章目录 1. 模板字符串1.1 ${} 使用1.2 字符串扩展(1) ! includes() / startsWith() / endsWith()(2) repeat() 2. 数值扩展2.1 二进制 八进制写法2.2 ! Number.isFinite() / Number.isNaN()2.3 inInteger()2.4 ! 极小常量值Number.EPSILON2.5 Math.trunc()2.6 Math.sign() 3.…...
《VMamba》论文笔记
原文链接: [2401.10166] VMamba: Visual State Space Model (arxiv.org) 原文笔记: What: VMamba: Visual State Space Model Why: 多年以来CNN和VIT作为视觉特征提取的主流框架 CNN具有模型简单,共享权重&…...
手机真机连接USB调试adb不识别不显示和TCPIP连接问题
手机真机连接USB调试adb devices不显示设备和TCPIP连接 本文手机型号为NOVA 7 ,其他型号手机在开发人员模式打开等方式可能略有不同,需根据自己的手机型号修改。 文章目录 1. 打开和关闭开发者模式2. 真机USB连接调试adb不显示设备问题的若干解决方法3…...
MySQL分表后,如何做分页查询?
参考: https://blog.csdn.net/qq_44732146/article/details/127616258 user.sql 完整的执行一遍,可以做到分表和分页 数据是实时的,往一张子表里插入之后,all表就能立刻查询到 在这里实现分页查询的是MyIsam引擎,这个引擎不支持…...
【Deep Learning 11】Graph Neural Network
🌞欢迎来到图神经网络的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年3月20日…...
http和https的工作原理是什么?
HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)是两种用于在互联网上传输数据的主要协议,它们均用于在客户端(通常是Web浏览器)与服务器之间交换信息。尽管它们…...
STL中容器、算法、迭代器
STL标准模板库封装了常用的数据结构和算法,让程序员无需太关心真实的数据结构实现。 容器 容器:用来存放数据的。 STL容器就是将运用最广泛的的一些数据结构实现出来。 常用的数据结构有:数组、链表、树、栈、队列、集合、映射表。 这些…...
深入并广泛了解Redis常见的缓存使用问题
Redis 作为一门主流技术,缓存应用场景非常多,很多大中小厂的项目中都会使用redis作为缓存层使用。 但是Redis作为缓存,也会面临各种使用问题,比如数据一致性,缓存穿透,缓存击穿,缓存雪崩&#…...
nginx界面管理工具之nginxWebUI 搭建与使用
nginx界面管理工具之nginxWebUI 搭建与使用 一、nginxWebUI 1.nginx网页配置工具 官网地址: http://www.nginxwebui.cn 源码地址:https://git.chihiro.org.cn/chihiro/nginxWebUI 2.功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, tcp协议…...
linux下 罗技鼠标睡眠唤醒问题的解决
sudo dmesg | grep Logitech | grep -o -P "usb.?\s" 得到3-2,用上面这条命令得到哪个usb口。 下面这条命令禁用罗技鼠标睡眠唤醒系统(3-2改成你自己电脑上得到的usb口) sudo sh -c "echo disabled > /sys/bus/usb/devic…...
架构师之路--Docker的技术学习路径
Docker 的技术学习路径 一、引言 Docker 是一个开源的应用容器引擎,它可以让开发者将应用程序及其依赖包打包成一个可移植的容器,然后在任何支持 Docker 的操作系统上运行。Docker 具有轻量级、快速部署、可移植性强等优点,因此在现代软件开…...
【动手学深度学习-pytorch】 9.4 双向循环神经网络
在序列学习中,我们以往假设的目标是: 在给定观测的情况下 (例如,在时间序列的上下文中或在语言模型的上下文中), 对下一个输出进行建模。 虽然这是一个典型情景,但不是唯一的。 还可能发生什么其…...
网际协议 - IP
文章目录 目录 文章目录 前言 1 . 网际协议IP 1.1 网络层和数据链路层的关系 2. IP基础知识 2.1 什么是IP地址? 2.2 路由控制 3. IP地址基础知识 3.1 IP地址定义 3.2 IP地址组成 3.3 IP地址分类 3.4 子网掩码 IP地址分类导致浪费? 子网与子网掩码 3.5 CIDR与…...
DC-9靶场
一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-9.zip 2.虚拟机配置 设置虚拟机为nat,遇到错误点重试和是 开启虚拟机如下图所示 二.开始渗透 1. 信息收集 查找靶机的ip地址 arp-scan -l 发现靶机的ip地址为192.168.11…...
自定义类型(二)结构体位段,联合体,枚举
这周一时兴起,想写两篇文章来拿个卷吧,今天也是又来写一篇博客了,也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.30 小闭…...
MySQL5.7源码分析--解析
select语句会走的case COM_QUERY判断 具体流程如下: 1.获取网络包数据,拿到查询语句,放入thd->query alloc_query(thd, packet, packet_length) 2.先查询缓存,缓存命中直接返回结果,未命中则解析 功能集中在mys…...
windows10搭建reactnative,运行android全过程
环境描述 win10,react-native-cli是0.73,nodeJS是20,jdk17。这都是完全根据官网文档配置的。react-native环境搭建windows。当然官网文档会更新,得完全按照配置来安装,避免遇到环境不兼容情况。 安装nodeJS并配置 这里文档有详…...
小迪学习笔记(内网安全)(常见概念和信息收集)
小迪学习笔记(内网安全)(一) 内网分布图内网基本概念工作组和域环境的优缺点内网常用命令域的分类单域父域和子域域数和域森林 Linux域渗透问题内网安全流程小迪演示环境信息收集mimikatzLazagne(all)凭据信息政集操作演示探针主机…...
Python自动连接SSH
Python自动连接SSH 在 Python 中,可以使用 paramiko 模块来编写脚本自动执行 SSH 命令。paramiko 是一个用于 SSHv2 的 Python 实现,可以帮助你在脚本中进行远程执行命令。 首先,确保安装了 paramiko: pip install paramiko然后…...
机器学习实验------AGNES层次聚类方法
机器学习 — AGNES层次聚类方法 第1关:距离的计算 任务描述 本关任务:根据本关所学知识,完成calc_min_dist函数,calc_max_dist函数以及calc_avg_dist函数分别实现计算两个簇之间的最短距离、最远距离和平均距离。 import numpy as np def calc_min_dist(cluster1, clus…...
HBase常用的Filter过滤器操作
HBase过滤器种类很多,我们选择8种常用的过滤器进行介绍。为了获得更好的示例效果,先利用HBase Shell新建students表格,并往表格中进行写入多行数据。 一、数据准备工作 (1)在默认命名空间中新建表格students…...
容器安全与防御(德迅蜂巢)
通过容器可以快速的运行应用、迁移应用、快速集成、快速部署、也提高了系统的资源利用率,因此现在越来越多的企业把应用上云,来达到快速上线应用、方便运维的目的。容器安全也逐渐地被重视起来,了解容器如何检测当前企业环境内容器环境是否安…...
【面经八股】搜广推方向:面试记录(十一)
【面经&八股】搜广推方向:面试记录(十一) 文章目录 【面经&八股】搜广推方向:面试记录(十一)1. 自我介绍2. 实习经历问答4. 编程题5. 反问1. 自我介绍 。。。。。。 2. 实习经历问答 就是对自己实习事情要足够的清晰,不熟的不要写在简历上!!! 其中,有个 …...
第十四章 MySQL
一、MySQL 1.1 MySql 体系结构 MySQL 架构总共四层,在上图中以虚线作为划分。 1. 最上层的服务并不是 MySQL 独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。 2. 第二层的架构包括…...
C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现
在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…...
VBA语言専攻介绍(20240331更新)
VBA语言専攻简介 “VBA语言専攻”是大家汲取知识的源泉,是提高自己能力的净土,正如我对平台的介绍:社会的进步,源于对知识的尊重和敬仰。希望每一位学员,每一位关注平台的朋友,都能很好的利用这个平台来学…...
Golang- 邮件服务,发送邮件
依赖 go get -u github.com/jordan-wright/email文档 文档 示例代码 邮箱的相关配置 # email configuration email:port: 25 # 端口要配置25 否则可能出现EOF错误from: xxx1qq.comhost: smtp.qq.comis-ssl: truesecret: xxxxxnickname: 大锦余发送邮件代码 package utili…...
电子网站有哪些/宁波网站制作设计
前言Redis提供了5种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要。Redis中的list是我们经常使用到的一种数据类型,根据使用方式的不同,可以…...
改善网站建设/最新seo课程
介绍(2021-05-12)用*好的iOS鼾声分析软件来记录、测量和减少您的鼾声。医生强烈推荐!鼾声分析器利用声波分析来测量和记录鼾声,帮助您找出减少鼾声的有效方法。“这个应用是个意外的惊喜。我第一次感觉能够控制打鼾了。谢谢鼾声分析器!”“鼾…...
公司网站建设工作重点/提高网站搜索排名
问题描述 今天在设计python串口代码时遇见一个问题,接收到的数据打印出来,一直都是两三组连在一起,即我的目标数据是: 7e307d02087d01557e 但是我把接收到的数据经过处理打印出来后是:7e307d02087d01557e7e307d02087d…...
做网站开发 用什么/网站收录有什么用
iOS 7 春风又绿加州岸,物是人非又一年。WWDC 2013 keynote落下帷幕,新的iOS开发旅程也由此开启。在iOS7界面重大变革的背后,开发者们需要知道的又有哪些呢。同去年一样,我会先简单纵览地介绍iOS7中我个人认为开发者需要着重关注和…...
三亚疫情最新政策/关键词优化是怎么弄的
const iterator表示iterator是const的,即iterator本身不能改变或者说iterator指针不能改变,但是iterator所指向的内容可以改变。比如, const std::vector<int>::iterator iter vec.begin(); *iter 10;是对的,改变iter指…...
曲靖网站制作一条龙/百度云群组
转自:http://blog.chinaunix.net/space.php?uid22600159&doblog&id2124188 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支…...