加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

API开发实战:多进程(事件控制SetEvent)

(2018-01-19 14:41:14)
分类: API开发
多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。所以在策略并行的层面更多是采取多进程而不是多线程。线程和进程的概念必须弄清楚,线程有线程的回调函数,进程由进程的回调函数,而且进程和进程之间还涉及数据交流,这在所有编程语言里面概念都是通用的,c++,java和动态语言类似py等在线程和进程方面原理基本一样,例如c++进程是event,py是process,而线程都是thread,而数据方面c++通过createvent的第四个参数进行数据交流,通过object进行控制,而py则通过queue,pipes等交换数据,进程可以包含线程,线程里面也可以开进程(很少这样弄),通常实现并行的方案无非三种,一种是多进程单线程,一种是单进程多线程,最后是做进程多线程,实际上前两种都经常用到,最后一种比较少,但恰恰在API的交易监控平台开发就用到第三种,在主程序进程里面加入手工干预的线程,而在策略并行或者数据下盘等其他并行任务则大多需要采用多进程的方式,最大的原因是要保证参数的互相独立,一旦概念弄清楚了写起来也不难
前文提到的多线程范例由主程序调用三个线程共享一个回调函数从而达到并行目的,实际上三个线程在同一个主进程里面,这就造成变量的混乱,本文加入事件控制--createEvent来创建多进程保证线程之间互不干扰,实际交易中线程的运用主要有两种,一种是设置子线程进行各种输出或者手工下单(手工也是风控的一种,毕竟程序永远会出现意想不到的事情),手工输入不存在变量的问题,一种是把策略分成各个独立进程进行并行下单,前一种非常简单,后一种在进程控制方面比较麻烦,大体思路是在初始化建立好多个策略进程并开启(每个进程event包含一个thread),然后各个策略进程启动进入循环等待行情事件,策略模块与深度行情之间通过事件交流,这就涉及到不能通过单独一个线程回调函数解决问题,因为如果多个进程共同调用一个线程回调函数那么如何复位避免重复计算是个问题,事实上我们并不需要控制各个子进程的先后顺序,但必须保证每条行情每个进程只计算一次,达到的方法有很多,下面先介绍一种最简单的,就是分开创建各个子进程然后把线程回调函数也分开写,创建后之后在主程序通过setEvent控制各个线程工作,由主程序统一控制。(实盘中这里写在函数里面)
上面建立了三个独立的回调函数供线程调用

主程序中创建事件,API平台中这三个控制进程的句柄应该是全局变量供成员函数调用,这里bManualReset设置成FALSE,保证每次线程只计算一次后自动复位,如果设置成TRUE就得在回调里面加入ResetEvent, bInitialState设置成FALSE初始化无信号,创建好后调用函数go()创建各个子进程然后进入循环等待状态(已设置初始状态为FALSE所以这时线程没有等到object所以不会调用函数工作),然后主程序每秒发信号给各个进程工作,释放后各自复位等待下一秒的信号
计算输出如下,每秒三个线程并行计算一次,每秒重复一次直到5次退出,

如果bManualReset为TRUE又没有加入手动控制线程将会不断循环计算,由于线程回调函数是一个循环,所以必须由进入退出控制等机制

通过设置断点进一步理解程序运行的顺序
创建线程后回到主程序第一次SetEvent在线程的回调函数里面进行实例化然后进入while循环
进入循环后程序就在线程的while循环和进程的setEvent之间来回往返,就是说第二个SetEvent开始直接运行循环里面的内容,这时线程的回调函数和外界的沟通桥梁就是Object,写入API平台要复杂一点,涉及其他线程和成员函数问题,需要用指针和结构体等联系起来,毕竟复杂的平台不可能都写在主程序里面,同时还需要注意程序的稳定性和效率,用多线程的目的是效率而多线程本身又是有消耗的,所以最终还得根据效率值进行取舍,一个漫长的测试过程必不可少。

实际写入API交易平台上例多进程的回调中经常会用到不止一个指针,多进程在函数里实例化指向本类可以用this,如果跨类需要通过一个已经实例化的全局指针过渡,下面是一个API平台的多进程在结构体里面包含一个md指针和一个td指针,由于在md类里面创建线程所以md指针用this而td指针通过一个全局指针TDpointer过渡,TDpointer必须已经实例化:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有