0

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

此过程每分钟运行一次

但是,随着越来越多的客户添加到我们的系统中,需要为每个客户重复相同的过程。

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

CUSTOMERS = get_all_customers()
FOREACH(客户中的客户)
    我的方法(客户)
结束

以上似乎效率很低。

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

CUSTOMERS = get_all_customers()
FOREACH(客户中的客户)
    StartNewThread(我的方法(客户))
结束

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

4

1 回答 1

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,可用线程的静态数量,并让每个线程获取客户端寄存器,并使用同步函数返回数组中的当前索引并将其增加一。在Java中类似

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

检查 -1,如果一个线程得到它,它就会停止。

于 2013-09-20T01:33:52.900 回答