多线程的答案是什么?处理大量处理

时间:2013-09-20 01:24:06

标签: .net multithreading process load-balancing

我们目前有一种方法可以从我们的数据库中读取客户数据,检查数据是否存在某些情况,然后根据是否满足这些条件发出电子邮件通知。

此过程每分钟运行

但是,随着越来越多的客户加入我们的系统,每个客户都需要重复相同的流程。

当然,像这样对每个客户进行FOR循环是没有意义的:

CUSTOMERS = get_all_customers()
FOREACH( customer in CUSTOMERS )
    MyMethod(customer)
END FOR

上述效果似乎非常低效。

我认为多线程方法会更好用,如下所示:

CUSTOMERS = get_all_customers()
FOREACH( customer in CUSTOMERS )
    StartNewThread( MyMethod(customer) )
END FOR

这有什么问题吗?特别是,假设有10个客户,那么我相信它会很好 - 10个线程将跨越。但是当有50或100个客户时会发生什么?这意味着每分钟产生100个线程!我有什么选择?

1 个答案:

答案 0 :(得分:0)

您需要考虑开销时间/上下文切换,如果您有1000个用户,那么将是1000个线程,加上线程创建时间。我建议你这样:

CUSTOMERS = get_all_customers()
size = CUSTOMERS.size()/1000;
for (int i = 0; i < size; i++) {
    StartNewThread(MyMethodOnArray(Array, size*i, size*(i+1) -1));
}

为每1k寄存器获取一个线程,以补偿开销。或者这样做,使用ThreadPool,静态数量的可用线程,并让每个线程获取一个客户端寄存器,并使用一个synchronized函数,它返回数组中的当前索引并将其增加一。 在Java中类似于

int current_client;
synchronized int getIndex() {
    int j = current_client;
    current_client++;
    if (j < CUSTOMERS.size())
         return j;
     return -1;
}

检查-1,如果线程得到,则停止。