【发布时间】:2019-03-14 23:16:46
【问题描述】:
我做一个实验,我有一个 100000 增量的循环,里面有一个执行特定任务的线程(将日志写入数据库),我的问题是当我运行它时它可能在一秒钟内完成并且它最近开始插入它们,那么操作系统如何处理它们,它将全部处理还是跳过它们? 我和他们一起尝试等待的方法,它很好。但我想知道如果此代码在服务器上并收到 100000 个请求会发生什么。 代码:
for (int i = 0; i < 100000; i++)
{
Task.Run(() => log.WriteToLog(i + "", new Models.CustomerModel.CustomerModel()));
}
我不是在寻找替代方法,我需要知道代码在操作系统中的行为和处理方式(如果有队列,其中一些会运行,等等)
PS:我知道这不是一个好方法
【问题讨论】:
-
同时启动 100.000 个任务是一个非常糟糕的主意。它理论上可以启动相同数量的线程,这是一个巨大的资源消耗,并且可以使系统几乎停止。您不等待任务,这很好,但是您需要考虑当无法编写时会发生什么。在这种情况下,多达 100.000 个异常可能会作为未观察到的异常发布到任务调度程序,因此可能会向用户显示这么多的错误消息。
-
还可以处理任务并以任意顺序进行,因此您的日志到处都是。一个更好的想法是有一个专门的日志记录任务并将日志消息推送到这个任务中进行处理。对于这种生产者(提供日志条目)和消费者(输出条目)以不同速度运行并且可能有许多生产者的用例,您应该使用生产者消费者模式,请参阅docs.microsoft.com/dotnet/api/… 中的示例
-
我知道它不好,但我们的想法是知道会发生什么,以及他们是否会去队列以将其与线程池方法进行比较。
-
@ckuri - 线程池和任务调度程序将限制这一点。这不是一个很好的方法,但你也不会得到 1000 个线程。
-
几十个在服务器上将是一场灾难,在客户端桌面上可以忽略不计。但 I/O 可能仍在扼杀它。这一切都取决于。所以是的,使用标准日志库。
标签: c# multithreading operating-system task task-parallel-library