我们目前有一种方法可以从我们的数据库中读取客户数据,检查数据是否存在某些情况,然后根据是否满足这些条件发出电子邮件通知。
此过程每分钟运行
但是,随着越来越多的客户加入我们的系统,每个客户都需要重复相同的流程。
当然,像这样对每个客户进行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个线程!我有什么选择?
答案 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,如果线程得到,则停止。