我开发了一个基于股票交易的金融服务应用程序。应用背后的想法是执行多个符号/划线的各种计算,并同时为每个符号生成买卖信号。每秒从数据供应商接收数据,然后执行计算。
背景 为此,我创建了一个计算类,它将接收单个符号的数据并执行计算并生成买/卖信号。
要对多个符号执行计算,我在每个符号的单独线程中实例化计算对象,如此
EventWaitHandle ew = new AutoResetEvent(initialState: false);
Thread t = new Thread(() => RunCalculations(s));
_waitList.Add(s.Symbol, ew);
t.Name = s.Symbol;
t.Start();
threadList.Add(s.Symbol, t);
上面的代码通过foreach在每个符号上进行迭代。
这就是RunCalculations();
private void RunCalculations(Symbols symbol)
{
Calculations calc = new Calculations(symbol);
while (true)
{
_waitList[symbol.Symbol].WaitOne();
if(!keepRunning[symbol.Symbol])
{
calc.Stop();
return;
}
MarketData d = null;
if(_mktDataQueue.TryDequeue(out d))
{
if (calc.SymbolName == d.Symbol)
calc.AddTickItem(d);
}
}
}
calc.AddTickItem()
将仅发送属于某个线程的一个符号的数据值。进一步的计算在Addtickitem
对象的calc
方法内调用。
通过AutoResetEvent,Iam在另一个方法中添加一个数据项,在每个线程上调用_waitList[data.Symbol].Set();
。
问题 计算工作正常。但问题在于添加更多线程(或符号)时的性能。我们测试了极限并发现,它只能在大约18 - 20个符号上正常工作。如果我们增加更多,那么计算部分将在市场营业时间结束前半小时推迟。但直到那个时候,它运作良好。另一个问题是,这并不是每天都会发生的。我们已经测试了多达28个符号并返回到19个符号,现在它已经稳定运行。
据我所知,由于Iam使用事件信令,因此对CPU来说不应该是更多的资源。 CPU实际上是一款2核intel i3处理器。
但我仍然想知道,如果它是处理器的问题,还是应该改变应用程序的架构?我想过改变线程管理的架构而不是符号,我会把每个计算部分放在不同的线程中。但问题是,有一些依赖计算,邪恶的并发同步;)让我做噩梦。
我将改变处理器,但我必须知道什么是最佳处理器(4核,8核等)。据我所知,只有核心无法解决问题。
任何建议都将不胜感激。
感谢。