1.通达信指标【强龙启动】强势抓龙主副选指标 源码(支持手机电脑)
2.Python解放双手将源代码自动转换为
3.CountDownLatch原理简介和使用过程
4.利用Python实现的源码双图美白与美化!三天换两个对象!源码双图
5.PolarDB-X 源码解读(七):私有协议连接的源码双图一生(CN篇)
通达信指标【强龙启动】强势抓龙主副选指标 源码(支持手机电脑)
通达信强龙启动指标套装提供主图、副图与选股功能。源码双图主图指标以红色高亮显示5日、源码双图日、源码双图独家源码泡泡im日与日移动平均线,源码双图辅助识别强势信号。源码双图
副图指标则强化启动信号的源码双图识别,用户能在盘中设置预警进行选股,源码双图指标支持手机与电脑操作,源码双图建议结合其他指标使用以增强分析效果。源码双图副图内含北斗8星副图,源码双图推荐使用六脉神剑全系列主副选指标。源码双图
主图指标源码如下:
MA1:MA(CLOSE,源码双图5);
MA2:MA(CLOSE,),COLORRED;
MA3:MA(CLOSE,);
MA6:MA(CLOSE,);
DRAWTEXT_FIX(1,0.,0.,0,'概念板块'),COLORYELLOW;
DRAWTEXT_FIX(1,0.,0.,0,GNBLOCK),COLORWHITE;
双涨寻龙1:=ROUND2(REF(CLOSE,1)*1.1,2);
双涨寻龙2:=C=双涨寻龙1;
双涨寻龙4:=BARSLAST(双涨寻龙2);
双涨寻龙5:=BETWEEN(双涨寻龙4,3,);
双涨寻龙6:=REF(双涨寻龙5,1)>0;
双涨寻龙7:=REF(双涨寻龙6,1)AND双涨寻龙2;
双涨寻龙8:=双涨寻龙7;
涨停:=IF(REF(C,1)*1.1-C<0.,1,0);
STICKLINE(涨停,OPEN,CLOSE,3.5,0),COLORF;
STICKLINE(涨停,OPEN,CLOSE,2.3,0),COLORYELLOW;
STICKLINE(涨停,H,L,0,0),COLORYELLOW;
寻龙:=FILTER(双涨寻龙8,5) AND REF(C,1)
DRAWICON(寻龙,L,9);
副图指标源码如下:
强龙头1:=ROUND2(REF(CLOSE,1)*1.1,2);强龙头2:=C=强龙头1;强龙头4:=BARSLAST(强龙头2);强龙头5:=BETWEEN(强龙头4,3,);强龙头6:=REF(强龙头5,1)>0;强龙头7:=REF(强龙头6,1)AND强龙头2;强龙头8:= 强龙头7;
双涨:=FILTER(强龙头8,5) AND REF(C,1)
注意:副图内含北斗8星副图,建议结合六脉神剑全系列主副选指标以优化分析。
Python解放双手将源代码自动转换为
将源代码自动转换为,有助于在微信、QQ等平台私下发送代码给他人,无需第三方阅读工具。Python脚本实现自动化转换,步骤如下:
第一步,利用gvim将源代码文件转换为html文件。
第二步,使用imgkit库将html文件转换为png文件。
进行准备工作:
配置vimrc文件以实现语法高亮,提高易读性。
安装wkhtmltopdf,并将路径加入系统默认路径,以支持html转。
通过pip安装imgkit库。
核心逻辑包括:
利用vim的:TOhtml命令生成html文件,然后wqa命令保存,退出gvim。
解决命令行界面打开及关闭、处理源代码文件中可能存在的.swp文件等问题。
使用imgkit将html文件转换为。
针对转换后的字体大小、宽度及代码行折行处理等进行优化,通过Python代码调整html文件格式。
最终效果展示,包括HelloWorld示例和脚本自身转换的效果,确保源代码以清晰、halcon视觉定位源码紧凑的形式呈现。
CountDownLatch原理简介和使用过程
CountDownLatch作为Java并发编程中的重要工具,它帮助实现线程间的同步与协作。其主要功能在于控制多个线程的执行顺序,确保在特定条件满足后,线程才能继续执行。这一特性在多线程编程中尤其有用,能够帮助实现一些复杂的逻辑处理。
在具体应用场景上,CountDownLatch常用于等待某个条件满足后,多个线程同时进行或某线程等待其他线程完成后再继续执行。例如,在并发环境中,一个任务可能需要等待一组任务全部完成,这时便可以使用CountDownLatch。
CountDownLatch的核心原理基于等待与计数机制,它允许线程在达到某个特定数量前暂停执行。当计数器的值为零时,等待线程会自动解除等待状态并继续执行。这一机制使得CountDownLatch成为控制线程执行流程、协调多个任务同步执行的利器。
通过上图,我们可以直观地理解CountDownLatch的工作原理。当初始化时,计数值被设定为待等待线程的数量。随后,调用countDown方法减小计数值,每调用一次,当计数值减少至零时,所有处于等待状态的线程将被唤醒。
进一步说明,CountDownLatch在多线程编程中的应用,如处理大量任务时,可以先启动所有任务线程,然后使用CountDownLatch控制主线程等待所有子任务完成后才继续执行下一步。这样,既实现了线程间的协调,又保证了任务执行的有序性。
为了更好地理解CountDownLatch的使用,以下是一个简单的Java代码示例,展示如何使用CountDownLatch实现线程间的协作与同步。在这个例子中,android获取webview源码我们创建了一个计数器,表示有三个任务需要完成,然后启动三个线程执行任务,最后通过CountDownLatch确保所有任务完成后,主线程继续执行。
在实际开发中,CountDownLatch的源码分析对于深入理解其内部机制有重要作用。通过源码,可以发现其利用了Java的线程安全机制以及同步器(Lock)来实现线程间的等待与唤醒。同时,双向链表数据结构在其中发挥了关键作用,用于存储等待的线程信息。
对于希望进一步学习CountDownLatch的开发者,推荐查阅相关技术文档和开源项目,如Apache Commons Pool等,其中包含了CountDownLatch的详细实现与使用案例,有助于深入理解并掌握这一重要并发控制工具。
利用Python实现的美白与美化!三天换两个对象!
利用Python实现美化与美白技巧
在计算机视觉领域,掌握处理技术尤其重要,特别是美化和美白。通过Python,我们可以添加各种图形元素,如线条、多边形和爱心,为增添趣味。比如,使用cv2.circle()和cv2.fillPoly()可以画出圆形和任意形状,cv2.putText()则用于添加文字,展示浪漫情意。 针对美白,我们可以通过提高图像亮度或调整RGB值,实现肤色的提亮。然而,美白操作需针对肤色而非全局,通过调整绿色和蓝色通道,保持红色部分不变,以实现自然效果。对于更精细的磨皮,双边滤波器cv2.bilateralFilter()能保持边缘清晰,增强的棋牌下载网站源码质感。 接下来是直方图均衡化,这是一种色彩调整方法,可以使图像色彩更加饱满,避免单调。通过对比原图和处理后的图像,可以看到色彩的细微变化,让看起来更加生动。 以上技术并非仅限于理论,你可以将这些技巧应用于实际,如给你的对象送上一张精心修饰的。如果你想深入了解和实践,记得关注我们的公众号"Python源码",获取更多代码示例和完整教程。每张的使用都是为了教学目的,如果产生任何版权问题,请告知我们,我们会及时处理。现在就动手,让你的焕然一新吧!PolarDB-X 源码解读(七):私有协议连接的一生(CN篇)
通过前文的介绍,大家基本了解了一条SQL在polardbx-sql中的解析和执行流程。由于polardbx-sql是无状态的计算节点,真正数据需要从存储节点传输到计算节点,这部分工作由私有协议完成。本文将详细介绍从发送请求到存储节点,接收返回数据的完整流程,重点在于私有协议连接的生命周期和关键代码解析。
概述
为了提高数据节点本地计算能力,同时减少网络数据传输量,计算节点会尽可能下推计算内容。一个逻辑表可能需要多个物理分片,因此计算节点与存储节点的请求会话数量会随着分片数增加而增加。传统MySQL协议+连接池架构已不能满足PolarDB-X的需求,因此私有协议在这一需求场景下应运而生。
如图所示,私有协议采用连接与会话分离的RPC协议设计理念,支持多个会话在同一个TCP通道中并行运行,具备流控机制、全双工响应式工作模式和高吞吐、可扩展等特性。
更多关于私有协议解决上述问题的设计详情,可以参考《PolarDB-X私有协议设计》一文。多条件排序源码本文主要从代码层面详细描述私有协议的工作流程。
我们将从计算节点和存储节点两个角度完整解析私有协议连接的生命周期。篇幅限制,本文仅关注计算节点上私有协议的处理,存储节点部分将在后续文章中详细说明。
计算节点
计算节点作为私有协议的客户端,负责发送下推请求,并接收返回的数据。
网络层框架
PolarDB-X私有协议网络层采用定制化Reactor框架实现,基于Java的NIO,改进自polardbx-sql中的Reactor框架。网络层初始化时,设置CPU核心数的2倍(上限为)作为NIOProcessor,每个Reactor使用独立的堆外内存池作为收发包缓冲,总缓冲内存大小限制为堆内存大小的%。
NIO接收的包直接调用注册的处理函数,发送数据仅写入send buf,网络写入由单独线程完成。线程优先写入TCP send buf,当无法写入时,注册OP_WRITE事件等待可写后再写入剩余内容。
数据包的编码和解码在NIOClient中实现。为实现最佳性能,解包流程直接在堆外内存上进行,使用protobuf对流直接解析,将结果放入堆内。堆外内存被切分为KB chunk,每个Reactor独占一个chunk,连续解析和复用,最大化接收、解析效率。对于特大包,额外构造堆内大buffer接收和解析,回退标志在定时任务中重置,连续s无超大包时释放堆内内存,恢复高性能堆外KB buffer接收。
请求发送集成在NIOClient中,writer优先尝试写入发送缓冲队列尾部的buffer,不足时新申请buffer填充并追加到队尾。buffer来自预分配的堆外缓冲池,超过chunk大小时分配堆内buf进行序列化。
同时,NIOClient负责TCP连接的建立和断开资源释放,作为独立的底层网络资源管理实现。
连接及会话
网络层之后,我们聚焦连接与会话分离的具体实现。通过剥离连接及收发包的具体实现,连接和会话的管理变得更加清晰简洁。
首先,一个TCP连接的逻辑抽象结构在XClient中实现,为避免误解,取名为client与JDBC中的Connection区别。该类管理TCP连接和并行运行的会话,负责TCP完整生命周期的管理、认证鉴权,并维护公共信息。其中,workingSessionMap记录了连接上并行运行的所有会话映射关系,可快速通过会话ID找到对应的会话抽象结构XSession。
XSession提供了所有会话相关的请求函数和信息存储,包括执行计划请求、SQL查询请求、SQL更新请求、TSO请求、会话变量处理、数据包处理及异步唤醒等。
连接池及全局单例管理器
为了提高性能,TCP连接和会话的复用必不可少。由于连接和会话的解绑,连接池不仅缓存了到计算节点的TCP连接,也缓存了到计算节点的会话。
XClientPool管理到一个存储节点的连接池,通过IP,端口,用户名三元组唯一确定目标存储节点,同时存储该节点的全部TCP连接(XClient)和建立的会话(XSession)。
XClientPool实现存储节点会话获取,对应JDBC接口中的getConnection,同时实现连接和会话生命周期管理、连接探活、会话预分配等功能。实现单个存储节点连接池后,XConnectionManager维护目标存储节点三元组到实例连接池的映射,管理定时任务线程池,实现定时探活、会话&连接最长生命控制以及连接池预热等功能。
JDBC兼容层
新的SQL协议层对上层使用者要求较高,为了提高开发效率,私有协议提供兼容JDBC的使用方法,实现从JDBC平滑切换至私有协议,并支持协议热切换。
JDBC兼容层代码目录在compatible目录下,Connection继承在XConnection文件中。提供包括DataSource、Connection、Statement、PreparedStatement、ResultSet、ResultSetMetaData在内的大部分常用接口函数实现,不支持的函数会明确抛出异常避免误用。
整体关系
至此,私有协议计算节点端的大部分结构已说明完成。给出一个整体的关系图。
私有协议连接的一生(CN视角)
了解了私有协议各层实现后,我们以发到存储节点的请求为例,完整梳理执行流程。绕开计算节点复杂流程,直接运行代码示例(注:需将com.alibaba.polardbx.rpc.XConfig#GALAXY_X_PROTOCOL设置为true)。
直接运行playground看到预期的select 1的结果。接下来,我们深入跟踪说明。
数据源初始化
要使用私有协议,需要初始化对应存储节点的XDataSource。构造过程中,XDataSource会到XConnectionManager注册新的实例连接池,已存在的连接池引用计数加一。
获取Connection
当需要执行查询时,首先获取会话。无论是显式开启事务还是使用auto commit事务,会话都是执行请求的最小上下文。通过XDataSource的getConnection方法获取到对应存储节点的会话。XDataSource根据存储的IP,端口,用户名三元组查找到XConnectionManager中的连接池,在最高并发检查后,会话获取逻辑在XClientPool实现。首先尝试在空闲会话池中拿会话,通过重置检查和初始化后返回给调用者。大部分场景下,ConcurrentLinkedQueue提供较好的并发性能。
在代码场景下,数据源刚新建,后台定时任务未运行,流程进入连接创建流程。会有一把大锁锁住连接池,在TCP连接未达上限且没有超时的情况下,快速新建一个XClient占坑。若超限,则进入busy waiting循环。真正的TCP connect(waitChannel)在锁外被调用,首先client以阻塞模式带超时方式connect,然后切换为非阻塞模式,round robin策略注册到NIOProcesser上,返回时,TCP连接已建立。
为了兼顾安全和性能,连接鉴权在TCP建连后只用做一次,会话创建不需要鉴权。鉴权在initClient中完成,发送SESS_AUTHENTICATE_START_VALUE包,后续校验由回调完成。认证采用标准的MySQL认证流程,server端返回challenge值,库名、用户名和加盐hash后的密码返回给MySQL即可完成认证。
至此,到存储节点的TCP连接已建立,创建会话是一个异步流程。在创建新XClient时,XConnection已new好,通过下断点跟进去可看到newXSession流程,分配session id,设置状态为init,将XSession绑定到XConnection上。
最后,XConnection经过初始化(重置auto commit状态)、重置默认DB、默认字符集(lazy操作)和统计信息记录,返回给用户使用。
发送查询请求
拿到初始化好的兼容JDBC的Connection,为了简化流程,直接调用XConnection中的execQuery。XConnection的execQuery包装了XSession的execQuery,执行前执行了设置流式模式。
首先记录调用信息进行统计,进入关键的initForRequest流程。XSession初始化流程lazy,仅分配session id,设置状态为Init,真正创建session时发送SESS_NEW给server,绑定新session和session id。如果session已复用,则状态为Ready。
执行字符集更改的lazy操作,session可能在其他请求中切换字符集,根据目标字符集和当前字符集对比,决定是否发送额外的字符集更改请求。
经过一系列变量设置、lazy DB设置和protobuf包构造,请求发送到存储节点执行。发送后,同步生成XResult负责结果解析,同时XResult按照请求顺序依次拉链表,确保结果与请求一一对应。
请求流水线结构如下图所示,处理完成前序请求后,才能解析后续结果。
接收结果集
请求已发送到存储节点执行,拿到XResult,通过XResult收集查询结果集。XResult与发送请求一一对应,存储节点处理也是在会话上排队进行,不会影响流水线上其他请求的返回,保证流水线正常工作。
首先,查看结果集处理的状态机,主要状态包括获取元数据、获取数据行、获取额外信息等,顺序固定,根据请求类型,部分环节可能被省略。报错处理贯穿整个状态机,任何报错信息都会导致状态机进入错误处理环节。
对于非流式数据读取,请求结束时主动调用finishBlockMode将所有数据读出并缓存到rows中。对于流式执行的情况,结果集状态机消费数据包队列由XResult的next函数推动,内部函数internalFetchOneObject递归调用前序XResult,消费前序请求结果,从数据包队列中消费并推动状态机流转。
对于查询,首先收到RESULTSET_COLUMN_META_DATA包,表示返回数据列定义,一个包表示一列。元数据包后,收到包含数据行的RESULTSET_ROW包,一个包对应一行。数据行传输完成后,server端发送RESULTSET_FETCH_DONE标示数据发送完成。请求结束前,NOTICE包用于告知客户端rows affected等信息。最后,SQL_STMT_EXECUTE_OK包标示请求结束。
至此,完整请求处理完成,控制台应显示查询结果。
总结
本文详细描述了私有协议连接流程中的关键点和关键数据结构,相信通过本文描述,大家掌握了私有协议连接流程的基本点,在调试和修改使用中能够更加得心应手。虽然本文篇幅较长,但实际使用中涉及更多高级特性的使用,如多请求流水线、流控、执行计划传输、chunk结果集传输等。通过本文,我们对私有协议连接流程有了深入理解,为在实际场景中应用提供坚实基础。