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

分类: API开发 |
多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。所以在策略并行的层面更多是采取多进程而不是多线程。线程和进程的概念必须弄清楚,线程有线程的回调函数,进程由进程的回调函数,而且进程和进程之间还涉及数据交流,这在所有编程语言里面概念都是通用的,c++,java和动态语言类似py等在线程和进程方面原理基本一样,例如c++进程是event,py是process,而线程都是thread,而数据方面c++通过createvent的第四个参数进行数据交流,通过object进行控制,而py则通过queue,pipes等交换数据,进程可以包含线程,线程里面也可以开进程(很少这样弄),通常实现并行的方案无非三种,一种是多进程单线程,一种是单进程多线程,最后是做进程多线程,实际上前两种都经常用到,最后一种比较少,但恰恰在API的交易监控平台开发就用到第三种,在主程序进程里面加入手工干预的线程,而在策略并行或者数据下盘等其他并行任务则大多需要采用多进程的方式,最大的原因是要保证参数的互相独立,一旦概念弄清楚了写起来也不难
上面建立了三个独立的回调函数供线程调用
主程序中创建事件,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必须已经实例化: