如果您向多个用户广播相同的短信,您应该在短信 api 中搜索广播命令。这将减少服务器上所需的操作数/带宽。
如果不存在广播支持,您应该在处理这些短信任务时获取其他请求。比如:
function smsTask(n)
{
doSmsWork(function(response){
if(n)
{
setTimeout(function(){
smsTask(n-1);
},0);
}
})
}
smsTask(num);
在if(n) 和smsTask(n-1) 之间,其他异步任务可以抽出时间来工作,包括获取/拦截新的 smsTasks 和 RAM 需求仅取决于正在进行的请求数,而不是 sms 任务数。如果您需要限制所有 sms 任务的带宽,您可以为 setTimeout 函数使用动态等待值(而不是 0),这可以将更多带宽专用于其他任务(如服务网页等),而不是被垃圾短信完全消耗。
如果您不要求异步处理新请求,那么您可以在 2 分钟内完成每个请求的整个工作,前提是其 I/O 受限:
function smsTask(n)
{
for(let i=0;i<n;i++)
doSmsWork(function(response){
})
}
smsTask(num);
在完美的 I/O 条件下,即使 n=1000,这也可以在 200ms-300ms 内完成。这仍然不会停止新任务/请求,但会给队列带来太大压力,并且可能会消耗更多内存,而其他版本仅根据飞行中的请求数量保持稳定的内存消耗。
如果您需要更少的 I/O 争用,您可以将任务放入队列中,并有一个专门的函数来处理队列:
let work = [];
function smsTask(n){ work.push(some_task(n)); }
setInterval(function(){
if(work.length > 0)
{
let task = work.shift();
task?.compute(); // does sms work
}
},1000);
这是一种稳态处理,只要工作队列没有溢出内存,它就不会因为突然的请求高峰而停止。也许这个的 setTimeout 版本更适合 CPU。