股票交易应用程序使用类库来获取股票报价更新的回调,另一个类库用于获取订单执行或取消的回调。我目前在线程池中执行回调。我为每个回调启动一个后台线程。线程非常短暂,所涉及的工作包括获取数据并通知观察者。一旦通知观察者,后台线程就会死亡。当我有策略订阅超过1000个活跃交易的符号时,我得到OutOfMemory异常。
如何改进此设计?我想在开始时启动两个线程,一个用于引号,另一个用于执行,并在各自的线程上创建每个对象。然后只有一个共享对象,允许添加和删除线程的观察者。但是1)你如何保持线程活着以接收回调? 2)你怎么能有一个回调对象,它在主线程上没有引用的线程上初始化?这甚至可能吗?
任何帮助都将不胜感激。
答案 0 :(得分:3)
将producer / consumer模型与简单队列一起使用。然后你有一定数量的工作线程在运行,你不会遇到这个问题。
至于如何调用回调函数,你可以使用这样的结构:
struct WorkerData
{
Data data;
Delegate someCallback;
}
当worker完成数据时,它可以调用回调本身。
答案 1 :(得分:1)
您所描述的是您的应用程序的总体情况。为了重新设计您的应用程序,我们具体要求,至少是参与者如何相互交互的简化模型。您的非正式描述不够精确,不足以建议特定的数据结构和算法,因为如果不了解所有足够的细节,我们可能会忽略一些关键且不符合您需求的内容。
你说的是所有正确的词,你有一个特定的问题,内存不足,你需要修复一些东西。回到原型设计。写一个非常小但残酷运用的程序来演示你想要做什么。然后将其缩放回您的应用程序。设计原型尺寸要容易得多。
修改强>
由于内存不足,最可能的原因是您有内存泄漏,或者您只是拥有一个近乎实时的系统,其容量不足以处理您遇到的负载。泄漏可能是由于通常的嫌疑人,例如没有分离你可以用内存分析器诊断的事件处理程序,但我们现在就要排除它。
如果你在更新时必须跟上报价,他们必须去某个地方,如队列或被派遣到一个线程,除非你能跟上,否则这可能会无限制地增长。
解决此问题的唯一方法是:
我认为您希望使用可能产生重大影响的新数据结构或算法更有效地处理报价的明确替代方案。但即使你确实提高效率,问题仍然会回来,你可能会被迫考虑在过载条件下优雅地降级,而不是在内存不足的情况下失败。
但总的来说,对于高性能而言,更简单的通常更好,更少的线程交换更好。例如,如果在更新中完成的工作很小,那么使它同步可能是一个巨大的胜利,即使它看起来反直觉。您必须知道更新处理程序的功能,并且最重要的是您需要测量,测量和测量的近实时系统,以便凭经验知道哪个是最快的。
答案 2 :(得分:0)
给我
我目前在线程池中执行回调
和
一旦通知观察者,后台线程就会死亡
有点矛盾。我怀疑你可能打算使用池中的线程,但每次都不小心使用新的“免费”(非池)线程。
您可能需要查看WeakReference的文档。
但是,我建议您首先使用profiler / perfmon来查找资源泄漏。用排队方法取代整个shebang听起来很合理,但它与你用正确的线程池所拥有的非常接近。