vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 4
声望: 0

最近在研究vnpy对CTP接口封装的源码,脑子里冒出一个问题,为什么在C++源码中,设置一个task_thread的线程?
例子:
以MdApi举例,现在MdApi回调函数触发时,会先将回调函数中的传来的参数包装进一个task,然后把这个task存入task_queue,随后由task_thread循环获取时间,转存为dict,再调用由python中继承的回调函数

为什么不直接在MdApi回调函数触发时,直接将传来的参数转存为dict,然后直接调用由python中继承的回调函数?

Administrator
avatar
加入于:
帖子: 4595
声望: 262

挺好的问题,因为:

  1. CTP类接口,用来缓存回调函数推送数据的缓冲区很小
  2. 回调函数是单线程驱动的,如果阻塞回调函数,就可能导致缓冲区溢出
  3. 往Python里创建数据和推送(任意PyObject),都需要先拿到解释器的全局锁GIL
  4. 而锁定GIL要花的时间,是不确定的,尤其当Python中某个线程目前在跑死时
  5. 这样就可能导致在小概率情境下,整个Python程序在C级别异常崩溃(没有任何异常捕捉)
  6. 所以要做个额外的缓存队列,以及额外的线程来推数据到Python中
© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号