专栏名称: 对冲研投
专业垂直的大类资产研投交流平台,聚合全球优质的金融会议、调研和培训,提供最有价值的研究逻辑和投资策略,做你身边的投研助手。官网:bestanalyst.cn
目录
相关文章推荐
洪观新闻  ·  金价暴涨! ·  15 小时前  
神嘛事儿  ·  我回答了 @飞天猪ZzzE ... ·  17 小时前  
21世纪经济报道  ·  【#十万一针抗癌药成本仅3000元##未获批 ... ·  昨天  
51好读  ›  专栏  ›  对冲研投

Quicklib和VNPY团队掐架,他们究竟在说什么?

对冲研投  · 公众号  · 财经  · 2017-04-07 21:57

正文



文 |  知乎 量化林

编辑 | 对冲研投   转载请注明出处


最近看到VNPY作者在自己的群,以及VNPY的核心团队大肆抨击Quicklib底层代码不干净的问题和一系列不怀好意想象出来关于Quicklib一系列的问题。甚至在VNPY的论坛社区大叫Quicklib是骗子。


是的,我在最近一年里,每天为更新Quicklib奋斗着,每天工作到13小时。不仅是Quicklib Python框架本身,也对各种实用的工具做了开发和提供。Quicklib框架已经开源。还提供了一些免费的工具,比如资金曲线分时图工具、历史行情全市场采集和回播、分布式计算等等。

诚然,我的底层代码有很多多余的调试注释,例如VNPY派抨击无关痛痒的没用到的CRC32和AES库,因为这一年又要保质又要保量的完成一系列框架和工具的开发。我一旦有了更新,立刻迫不及待的便去同步到开源中国的库上了。这个底层代码,对大部分人来说,你也用不着。如果整理的话,会大大降低更新速度,就是因为如此,Quicklib系列才更新的如此之快,一年时间便提供了大量工具软件。Quicklib的快速发展,在8个月时间里,Quciklib官方群的人数就超过了1000人。


我对不怀好意的*N核心团队说,冗余的注释可以删除,但是优秀的性能架构改不了。改了架构也就不是原来的了。

但你不得不承认这个Quicklib采用异步IO架构符合了Python的特点,扬长避短优秀。 同样采用异步架构的node.js单线程性能是PHP多线程并发的2-3倍。具体看后面评测,也可以参见《node.js开发指南》异步IO的性能的优异。对单线程全局锁的,让底层代码受应用层Python GIL的架构,合约一多起来就阻塞的传统架构可以说 Byebye了。


就好比同样采用异步IO的node.js,测试性能是PHP 2~3倍,当node.js向传统的PHP挑战的时候,PHP不可能改成异步IO来应对node.js,因为那样就不再是PHP了。只能通过贬低遮盖事实真相去掩盖减缓历史向前发展。

我们的本意都是让大家用更好的东西,而不是相互贬低和攻击。既然如此,我就把真相告知大家。


QuickLib程序化交易开源框架-首页

quicklib/Quicklib - 码云 - 开源中国

Quicklib 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方 案,相对于传统的VNPY、海风等架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。例如,对于简单而常见的数据库查询操作,按照传统方式实现的代码如下:


res = db.query('SELECT * from some_table');
res.output();

以上代码在执行到第一行的时候,线程会阻塞,等待数据库返回查询结果,然后再继续处理。然而,由于数据库查询可能涉及磁盘读写和网络通信,其延时可能相当大(长达几个到几百毫秒,相比CPU的时钟差了好几个数量级),线程会在这里阻塞等待结果返回。对于高并发的访问,一方面线程长期阻塞等待,另一方面为了应付新请求而不断增加线程,因此会浪费大量系统资源,同时线程的增多也会占用大量的 CPU 时间来处理内存上下文切换,而且还容易遭受低速连接攻击。

看看Quicklib 是如何解决这个问题的:


这段代码中 函数的参数是一个函数,我们称为回调函数。进程在执行到参数的时候,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。当数据库查询结果返回时,会将事件发送到事件队列,等到线程进入事件循环以后,才会调用之前的回调函数继续执行后面的逻辑。

Node.js 的异步机制是基于事件的,所有的磁盘 I/O、网络通信、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理。图1-1 描述了这个机制。Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU 和内存在同一时间集中处理一件事,同时尽可能让耗时的 I/O 操作并行执行。对于低速连接攻击,Node.js 只是在事件队列中增加请求,等待操作系统的回应,因而不会有任何多线程开销,很大程度上可以提高 Web 应用的健壮性,防止恶意攻击。

图1-1 事件循环这种异步事件模式的弊端也是显而易见的,因为它不符合开发者的常规线性思路,往往需要把一个完整的逻辑拆分为一个个事件,增加了开发和调试难度。

同样采用异步式I/O试讲驱动架构事件的node.js为例,该技术主要用在web服务器上。 以下是详细对比了 Node.js 与 PHP+Nginx 组合,来说明异步I/O的性能的优势。


结果显示在3000并发连接、30秒的测试下,输出“hello world”请求:


PHP 每秒响应请求数为3624,平均每个请求响应时间为0.39秒;


Node.js 每秒响应请求数为7677,平均每个请求响应时间为0.13秒。


而同样的测试,对MySQL查询操作:


PHP 每秒响应请求数为1293,平均每个请求响应时间为0.82秒;


Node.js 每秒响应请求数为2999,平均每个请求响应时间为0.33秒。


图中是Quicklib异步IO,订阅了10个合约,每秒每个合约2比TICK,也就是每秒20比TICK,打印60次情况下,cpu占有率(i7 4790K),并且底层的消息驱动从算法上做到了0延迟,这个和VNPY有很大的不同。

结论就是 :

在事件驱动效率上Python异步IO(Quicklib) > = 多线程(同样自行效率下的语言采用多线程) > Python单线程GIL锁的架构(典型代表PYCTP、VNPY等)

Quicklib利用Python特点,在底层驱动上采用了异步IO来替代多线程,使得底层没有全局锁,性能大大提高。进入应用层后,复杂的耗时计算则采用Python的多进程库。

Quciklib真正做到了Python的扬长避短

以下是Quicklib资金曲线工具,对高频交易的资金曲线进行测试


以下是全市场行情收集工具和回播python API


- END -



对冲研投知识库, 点击 直接查看

【基本功】

大宗商品投研方法论 | 期货投研框架思考 | 独立思考 | 股市投研基本功 | 宏观经济入门 | 量化交易入门 | 豆粕期权 基础 | 场外期权基础 | 波动率期限结构 研究 | 对冲基金商业模式 | 印度 经济 | 房价 研究| 新三板估值方法 | 美元投资手册 | 如何调研上市公司 | K线图是什么


【品种投研】

煤炭 | 黄金 |







请到「今天看啥」查看全文