CPU、内存使用、线程池使用 - ASP NET 核心身份未确认邮件用户删除处理 - 在应用程序中还是单独的应用程序中?
CPU, memory usage, thread pool usage - ASP NET core Identity not confirmed mail users delete handling - In app or separate app?
我想知道什么是更合适的解决方案。
我需要实施机器人来检查和删除未确认的注册用户,例如发送确认邮件后 7 天。 (如果用户不确认 his/her 帐户,我想从数据库中删除该用户)。
我想了 3 种方法:
- 直接在 ASP NET 核心应用程序中实现委托,运行 作为
24 小时睡眠循环中的异步任务。
- 创建控制台应用程序
这将 运行 循环 24 小时睡眠
- 创建控制台应用程序
由第三方软件定时启动
(例如 Cron 或 TaskScheduler)
以下哪种方式对 CPU 和内存使用的影响最小?
线程池的数量也有限,机器人越多,试图访问我的 ASP 网站的人的线程就越少,我说得对吗?
我的最后一个问题 > 这么长时间 Thread.Sleep 是个好主意吗?有些东西告诉我它真的不是。另一方面,它是一个 ASP,将 运行 持续数月甚至数年。
无论如何,我喜欢将所有功能都集中在一个应用程序中的愿景(可以在一个文件中配置并且所有功能都同时启动)。另一方面,有些事情告诉我这不是一个好主意。
当任务实际上是 运行 时,我希望内存和进程使用由任务所需的任何内容决定,并且每种方法都应该具有可比性。所以在不是运行.
的时候看资源使用应该会更有趣
- 正在使用定时器(或
await Task.Delay(..)
循环)
这只需要用于定时器或异步状态机的内存,以及用于代码的一些额外内存。这应该相当小,也许只有几千字节。空闲时不会使用处理器时间和线程。这假设您不持有任何大型数据结构。
- 在单独的持久控制台进程中
这将为 .Net 运行时使用几 MB 的内存,并为代码和数据使用一些额外的内存。实际上,如果计算机内存不足,我希望将内存分页到磁盘。空闲时不会使用处理器时间。
- 在单独的预定控制台进程中
这只会消耗调度程序对象的内存,而且应该是最小的。显然,空闲时不会使用处理器时间或线程。
总结
安排一个单独的进程会使用最少的资源。但是所有方法在空闲时都应该使用相当少量的资源。所以我认为应该根据其他标准做出选择,比如最容易维护的 and/or deploy.
如果需要,线程池将分配更多线程。一般来说,线程应该只在它们实际做某事时使用(即使用 await task
而不是 task.Wait()
),并且您将拥有比硬件线程更多的线程池线程。如果我观察到的线程数比平时多得多,我只会担心这一点。
如果可能,我会避免Thread.Sleep
。计时器或 await Task.Delay
通常更合适。
我想知道什么是更合适的解决方案。 我需要实施机器人来检查和删除未确认的注册用户,例如发送确认邮件后 7 天。 (如果用户不确认 his/her 帐户,我想从数据库中删除该用户)。 我想了 3 种方法:
- 直接在 ASP NET 核心应用程序中实现委托,运行 作为 24 小时睡眠循环中的异步任务。
- 创建控制台应用程序 这将 运行 循环 24 小时睡眠
- 创建控制台应用程序 由第三方软件定时启动 (例如 Cron 或 TaskScheduler)
以下哪种方式对 CPU 和内存使用的影响最小?
线程池的数量也有限,机器人越多,试图访问我的 ASP 网站的人的线程就越少,我说得对吗?
我的最后一个问题 > 这么长时间 Thread.Sleep 是个好主意吗?有些东西告诉我它真的不是。另一方面,它是一个 ASP,将 运行 持续数月甚至数年。
无论如何,我喜欢将所有功能都集中在一个应用程序中的愿景(可以在一个文件中配置并且所有功能都同时启动)。另一方面,有些事情告诉我这不是一个好主意。
当任务实际上是 运行 时,我希望内存和进程使用由任务所需的任何内容决定,并且每种方法都应该具有可比性。所以在不是运行.
的时候看资源使用应该会更有趣- 正在使用定时器(或
await Task.Delay(..)
循环)
这只需要用于定时器或异步状态机的内存,以及用于代码的一些额外内存。这应该相当小,也许只有几千字节。空闲时不会使用处理器时间和线程。这假设您不持有任何大型数据结构。
- 在单独的持久控制台进程中
这将为 .Net 运行时使用几 MB 的内存,并为代码和数据使用一些额外的内存。实际上,如果计算机内存不足,我希望将内存分页到磁盘。空闲时不会使用处理器时间。
- 在单独的预定控制台进程中
这只会消耗调度程序对象的内存,而且应该是最小的。显然,空闲时不会使用处理器时间或线程。
总结
安排一个单独的进程会使用最少的资源。但是所有方法在空闲时都应该使用相当少量的资源。所以我认为应该根据其他标准做出选择,比如最容易维护的 and/or deploy.
如果需要,线程池将分配更多线程。一般来说,线程应该只在它们实际做某事时使用(即使用 await task
而不是 task.Wait()
),并且您将拥有比硬件线程更多的线程池线程。如果我观察到的线程数比平时多得多,我只会担心这一点。
如果可能,我会避免Thread.Sleep
。计时器或 await Task.Delay
通常更合适。