文档章节

libuv的典型应用——CTP的Node.js封装

一个灰
 一个灰
发布于 2018/10/11 16:37
字数 673
阅读 163
收藏 0

写过CTP的同学可能不多,这是一个期货接口。没听说过的也无妨。

C++多线程回调

CTP 提供了若干个父类供开发者继承,里面的回调都是通过覆盖父类的纯虚函数实现。 当SDK有事件发生的时候,就会调用这些定义的回调函数。

class CThostFtdcTraderSpi
{
public:
	virtual void OnFrontConnected(){};
	virtual void OnFrontDisconnected(int nReason){};

编写一个这样的程序是十分痛苦的,因为回调函数的执行是在某个工作线程中。所以很容易引起并发读写的问题。代码会变得十分复杂。

编写过Node.js的同学一定以及十分习惯Node的单线程模式,回调函数执行的时候虽然有点“不同步”,但好歹是在一个线程中,所以定义域里面的变量可以随便使用。用惯这种方便的编程方式的同学,如果去接触一下C++那种多线程回调,一定会抓狂的。

那么如何让CTP开发也能很舒服呢?或者干脆将CTP封装成Node的原生模块,然后在Node中调用,岂不妙哉。

这时候协调C++多线程和Nodejs单线程的关键角色就登场了,这就是libuv。

#include <uv.h>
uv_async_t async_t;
uv_async_init(uv_default_loop(),&async_t,NULL);

我们可以初始化一个默认的事件循环。 然后我们可以把所有的回调虚函数都用下面的方式去实现

void uv_trader::OnFrontConnected() {		
	CbRtnField* field = new CbRtnField();
	field->eFlag = T_ON_CONNECT;//FrontConnected
    field->work.data = field;
	uv_queue_work(uv_default_loop(), &field->work, _on_async, _on_completed);
}

其中_on_async是个空函数,忽略。_on_completed函数回在事件循环的时候触发,保证在主线程中调用。然后我们在这个函数再去调用js的函数。

void uv_trader::_on_completed(uv_work_t * work,int){
	CbRtnField* cbTrnField = static_cast<CbRtnField*>(work->data);
	std::map<int, WrapTrader*>::iterator it = cb_map.find(cbTrnField->eFlag);
	if (it != cb_map.end()) {
		cb_map[cbTrnField->eFlag]->FunCallback(cbTrnField);
	}
	if (cbTrnField->rtnField)
		delete cbTrnField->rtnField;
	if (cbTrnField->rspInfo)
		delete cbTrnField->rspInfo;
	delete cbTrnField;
}

除了释放资源,上面代码就是从一个存储着js回调函数的map中找到对应的js函数进行调用。

这些js函数都是在事先注册好的,就在nodejs中。

trader.on("connect",function(result){
    console.log("on connected");
    trader.reqUserLogin('','','',function(result,iRequestID){
        console.log('login return val is '+result);
    });
});

js代码写起来就舒服多了。

https://github.com/langhuihui/node-ctp

© 著作权归作者所有

一个灰
粉丝 28
博文 33
码字总数 21699
作品 3
南京
高级程序员
私信 提问
深入理解Node.js:核心思想与源码分析【1】

标签: node 源码 学习 源码: nianniuer node背景,了解一下 (1)体系架构 Node.js主要分为四大部分,Node Standard Library,Node Bindings,V8,Libuv,架构图如下: Node Standard Libra...

张倩1488543336000
2018/07/02
0
0
《Node.js》之事件处理机制以及事件环机制(二)

传统服务器与Node.js的比较 传统的服务器在面临高并发的场景时,会使用多线程方案,服务器会为客户端的请求分配一个线程,使用同步的I/O,系统通过线程切换来弥补同步I/O调用过程中的时间开销...

同Young不同样
2018/08/08
29
0
从源码解读 Node 事件循环

Node 是为构建实时 Web 应用而诞生的,可以让 JavaScript 运行在服务端的平台。它具有事件驱动、单线程、异步 I/O 等特性。这些特性不仅带来了巨大的性能提升,有效的解决了高并发问题,还避...

海致前端团队
08/02
0
0
Chrome V8 与 Node.js

从某种意义上来说,Node.js 并不是一个从零开始编写的 JavaScript 运行时,它其实也是站在“巨人的肩膀”上进行了一系列的拼凑和封装得到的结果。它的高效离不开一些很牛的第三方程序和类库。...

博文视点
2018/06/14
0
0
深入分析Node.js事件循环与消息队列

多数的网站不需要大量计算,程序花费的时间主要集中在磁盘 I/O 和网络 I/O 上面 SSD读取很快,但和CPU处理指令的速度比起来也不在一个数量级上,而且网络上一个数据包来回的时间更慢: 一个数...

小平果118
2018/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

刚哥谈架构 (二) 我眼中的架构师

之前在公司,有小伙伴在向别人介绍我的时候,经常会有人这么说:“刚哥是我们的architcture”,如果来人是老外,心中一定是一惊,心中暗叹,“这位匪首看上去貌不惊人,难道已经做到了架构和...

naughty
45分钟前
3
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
123
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部