我已经使用webforms写了一个电报机器人,一直都是真的while循环,一个线程总是发布到api.telegram.org/bottoken/getupdates到一个包含100个更新的get json格式数组。
我的机器人的主机配置不足以处理例如200个并发电报机器人请求。 所以我最终提出了一个改进并发用户数量的想法,并给予时间来执行他们需要的东西。请告诉我它是真还是完全错。
我在获取每次更新后在我的while循环中使用await Task.Delay(150)
,因此while线程将返回到线程池(??)并且程序有150多毫秒来处理例如100个请求然后去下一个更新阵列来自电报。
while (!cancellationToken.IsCancellationRequested) {
await Get100UpdatesAndProcess();//database works, sending answers etc...
await Task.Delay(150);
}
这项工作是否存在任何问题,即性能问题,内存泄漏,无用,线程浪费等,
感谢
答案 0 :(得分:0)
你的方法似乎正确,我无法预见任何内存泄漏或其他什么。 一个小的改变可能是避免TPL的2同步:
while (!cancellationToken.IsCancellationRequested)
{
await Get100UpdatesAndProcess().ContinueWith(t => Task.Delay(150));
}
但无论如何,现在长期运行的任务分两步处理:接收和处理。如果您有一个队列系统(MSMQ,Rabbit MQ),您可以以类似于生产者消费者的方式拆分任务。 您将看到您的应用程序具有容错能力,可分发性,并且通常更加分离。
您的代码如下所示:
while (!cancellationToken.IsCancellationRequested)
{
var updates = await Get100Updates();
foreach (var upt in updates)
{
Q.Enqueue(upt); // This is referring to the Queueing System, don't take it literally
}
}
并在不同的线程或节点或应用程序中
while (!cancellationToken.IsCancellationRequested)
{
var upt = Q.Dequeue() // Get pending update for processing
await Process(upt);
}
使用此样式,您几乎可以使用所有可用的CPU时间,并且没有未使用的延迟。