源码

admin- 源码解析(流程)

强颜欢笑 提交于 2020-02-15 15:27:39
首先我们需要了解一个知识点:---单例模式--- 单例模式 单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保 某一个类只有一个实例存在 。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。 在 Python 中,我们可以用多种方法来实现单例模式: 使用模块 使用 __new__ 使用装饰器(decorator) 使用元类(metaclass) 使用__new__ 为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程,代码如下: class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cls._instance = super

解读python中SocketServer源码

你。 提交于 2020-02-15 15:11:07
# 为什么会出现黏包现象? # 首先只有在TCP协议中才会出现黏包现象, # 是因为TCP协议是面向流的协议 # 在发送的数据传输的过程中还有缓存机制来避免数据丢失 # 因此 在连续发送小数据的时候 以及接收大小不符的时候都容易出现黏包现象 # 本质还是因为我们在接收数据的时候不知道发送的数据的长短 # 解决黏包问题 # 在传输大量数据之前先告诉接收端要发送的数据大小 # 如果想更漂亮的解决问题,可以通过struct模块来定制协议 1,解决方案一   问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据。 #_*_coding:utf-8_*_ import socket,subprocess ip_port=('127.0.0.1',8080) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(ip_port) s.listen(5) while True: conn,addr=s.accept() print('客户端',addr) while True: msg

Datax的执行流程源码分析

懵懂的女人 提交于 2020-02-15 12:54:43
DataX的框架的核心部分 1、配置贯穿DataX,all in configuration,将配置的json用到了极致 2、另一块是通过URLClassLoader实现插件的热加载。 Job&Task概念  在DataX的逻辑模型中包括job、task两个维度,通过将job进行task拆分,然后将task合并到taskGroup进行运行。 job实例运行在jobContainer容器中,它是所有任务的master,负责初始化、拆分、调度、运行、回收、监控和汇报,但它并不做实际的数据同步操作。 Job: Job是DataX用以描述从一个源头到一个目的端的同步作业,是DataX数据同步的最小业务单元。比如:从一张mysql的表同步到odps的一个表的特定分区。 Task: Task是为最大化而把Job拆分得到的最小执行单元。比如:读一张有1024个分表的mysql分库分表的Job,拆分成1024个读Task,用若干个并发执行。 TaskGroup: 描述的是一组Task集合。在同一个TaskGroupContainer执行下的Task集合称之为TaskGroup。 JobContainer: Job执行器,负责Job全局拆分、调度、前置语句和后置语句等工作的工作单元 TaskGroupContainer: TaskGroup执行器,负责执行一组Task的工作单元。 简而言之,

OracleJDK和OpenJDK

蓝咒 提交于 2020-02-15 12:48:21
OpenJDK是Sun在2006年末把Java开源而产生的项目,这儿的“开源”是一般意义上的源码开放形式,即源码是可被复用的,比如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。 OracleJDK选用了商业实现,而OpenJDK使用的是开源的FreeType。 当然,“相同”是建立在二者共有的组件基础上的,OracleJDK中还会存在某些OpenJDK没有的、商用闭源的功能。 比如从JRockit移植改造而来的JavaFlightRecorder,预计以后JRockit的MissionControl移植到HotSpot以后,也会以OracleJDK特有、闭源的形式提供。 Oracle的项目发布经理JoeDarcy在OSCON2011上对二者关系的详细介绍也确认了OpenJDK7和OracleJDK7在程序上是非常贴近的,二者共用了大量相同的代码.。 如下图,特别注意图中提示了二者相同代码的占比要远高于图形上看到的比例,所以我们编译的OpenJDK,通常可以认为性能、功能和执行逻辑上都和官方的OracleJDK是一致的。 在大多数Linux发行版本里,内置或者通过软件源安装的JDK,都是安装的OpenJDK。 到底什么是OpenJDK? 历史上的原因是,OpenJDK是JDK的开放源码版本,以GPL协议的形式发布。 开源协议参考

Spring IOC源码解读

只愿长相守 提交于 2020-02-15 11:19:49
public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors

springboot源码之监听器使用

混江龙づ霸主 提交于 2020-02-15 02:01:53
介绍一下监听器的三种使用方式 第一种: 实现ApplicationListener接口后配置在spring.factories文件中 package com.jun.lee.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationStartingEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * <Description> * 第一种实现方式 * @author Jun Lee * @version 1.0 * @createDate 2020/02/14 12:48 * @see com.jun.lee.listener */ @Component @Slf4j @Order(1) public class FistListener implements ApplicationListener<ApplicationStartingEvent> {

DotNet源码学习-HASHSET(初探)

浪尽此生 提交于 2020-02-15 01:16:32
命名空间:System.Collections.Generic 先看一下官方说明: 类提供了高级的设置操作。 集是不包含重复元素的集合,其元素无特定顺序 。 HashSet <T>对象的容量是对象可以容纳的元素数。当向对象添加元素时,HashSet <T>对象的容量会自动增加。 HashSet<String> hashSet = new HashSet<string>(); hashSet.Add("test"); hashSet.Add("test"); Console.WriteLine(hashSet.Count); 打印结果:1 HashSet的默认构造方法: public HashSet() : this((IEqualityComparer<T>?)null) { } 注:: this语法为调用自身对象的其他构造方法。 public HashSet(IEqualityComparer<T>? comparer) { if (comparer == EqualityComparer<T>.Default) { comparer = null; } _comparer = comparer; _lastIndex = 0; _count = 0; _freeList = -1; _version = 0; } 第二中创建方式,将集合作为参数。 List<string>

Linux下通过源码编译安装程序

喜你入骨 提交于 2020-02-14 17:56:25
相似的文章还有https: //www.linuxidc.com/Linux/2018-12/155637.htm https://blog.csdn.net/s1375555/article/details/80445425 https://www.jianshu.com/p/267b393ca7cd 本文简单的记录了下,在Linux下如何通过源码安装程序,以及相关的知识。 一、程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在Linux下用man命令查看的命令的文档 二、Linux下程序的存放目录 Linux程序的存放目录大致有三个地方: /etc, /bin, /sbin, /lib :系统启动就需要用到的程序,这些目录不能挂载额外的分区,必须在根文件系统的分区上 /usr/bin,/usr/sbin,/usr/lib:操作系统核心功能,可以单独分区 /usr/local/bin,/usr/local/sbin,/usr/local/lib,/usr/local/etc,/usr/local/man:这个用于安装第三方程序,分别对应了二进制文件、库文件、配置文件、帮助文档的目录 通常来说我们安装程序就安装在 /usr

Kubernetes源码之旅:从kubectl到API Server

半城伤御伤魂 提交于 2020-02-14 14:52:12
概述: Kubernetes项目目前依然延续着之前爆炸式的扩张。急需能够理解Kubernetes原理并且贡献代码的软件开发者。学习Kubernetes源码并不容易。Kubernetes是使用相对年轻的Go语言编写,并且拥有大量的源代码。在这个系列的多篇文章里,我将为大家深入分析Kubernetes的关键源码,以及介绍那些帮助我理解源码的技术。我的目标是提供一系列的文章,让对于Kubernetes还较为陌生的开发者能够快速学习 Kubernetes源码 。 在第一篇文章里,我会分析从运行一个简单的kubectl命令到向API Server发送REST调用的源码执行过程。在开始深入Kubernetes之前,我建议你先阅读一下Julia Evans对Kubernetes架构的高级概述分析的文章。 Kubectl命令的基本运行 Kubernetes里的命令行接口叫做kubectl。它用来控制Kubernetes集群。阅读这部分源码实现是一个好的开始。我们要追踪的命令是 kubectl create -f ——它会从文件创建K8s资源。我们要创建的资源是使用了 Nginx 基础镜像的单副本 Pod 。下面是它的yaml描述: apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 1