-1

我有一个程序可以处理来自经纪人的价格数据。伪代码如下:

 Process[] process = new Process[50];

 void tickEvent(object sender, EventArgs e)
 {
    int contractNumber = e.contractNumber;

    doPriceProcess(process[contractNumber], e);
 }

现在我想使用多线程来加速我的程序,如果数据是不同的合同号,我想触发不同的线程来加速这个过程。但是,如果数据来自同一个合同,我希望程序等到当前进程完成,然后再继续下一个数据。我该怎么做?

你能提供一些代码吗?

先谢谢了~

4

2 回答 2

1

您需要在这里做出许多高级别的架构决策:

您预计该经纪人会产生多少滴答声?

毕竟,你应该在这里有一些好心的调度员。

以下是对基本上要做的事情的一些简单描述:

  • 将传入的刻度封装在包中,最好的单个命令具有所需的所有数据

  • 有一个队列,您可以轻松(并且线程安全)存储这些命令

  • 有一个调度程序,它接收队列中的一个项目并分配一些工作人员来执行命令(或让命令自行执行)

  • 拥有一个工人,您可以拥有多个线程、进程或任何东西来无缝地处理多个命令

  • 也许您想对输入队列进行一些调度,具体取决于您希望每个时间单位能够完成多少请求。

以下是一些可能有用的更多信息:

C#中的命令模式

反应堆模式(附示例代码)

于 2012-07-19T19:56:30.133 回答
0

Process我不会持有一个 es数组,而是持有一个BlockingCollections 数组。每个阻塞集合可以对应一个特定的合约。然后,您可以让生产者线程将工作添加到相应合约队列的末尾,并且您可以让生产者队列使用这些集合的结果。您可以确保每个线程(我会为此使用线程,而不是进程)处理 1-n 个不同的队列,但每个队列不超过一个线程处理。这样,您可以确保不会并行处理同一合同中的任何工作。

Task可以使用 C# 的类有效地处理此线程方面的问题。对于您的消费者,您可以为每个BlockingCollection. 该任务的主体几乎就是:

foreach(SomeType item in blockingCollections[contractNumber].GetConsumingEnumerable())
  processItem(item);

但是,通过使用Tasks,您可以让计算机按照它认为合适的方式安排它们。如果它注意到他们中的大多数人坐在空队列上等待,它将只有几个(或只有一个)实际线程在它正在使用的任务之间旋转。如果他们试图做的足够多,并且您的计算机可以清楚地支持额外线程的负载,它将添加更多(可能会随着它的进行动态添加/删除)。通过让比你或我更聪明的人来处理调度,它更有可能在没有不足或过度并行化的情况下变得高效。

于 2012-07-19T19:37:07.520 回答