a)我有一项任务,我希望服务器每隔X小时为每个用户(~5000个用户)做。是否更好:
1 - 为执行任务的每个用户创建一个工作线程,然后休眠X小时,然后重新开始,每个任务在随机时间运行(这样大多数任务都会在每个时刻都处于休眠状态)
2 - 创建一个循环用户的线程,为每个用户执行任务,然后重新开始(即使这需要超过X小时)。
b)如果使用计划1,那么睡眠线程是否会影响服务器的性能? c)如果答案是肯定的,那么休眠线程是否与执行任务的线程具有相同的效果?
请注意,此服务器不仅用于此任务。它用于与~5000个客户的所有通信。
答案 0 :(得分:0)
关于您的问题,没有足够的详细信息可以获得完整的答案。但是,根据您提供的信息,我会:
然后说你想要执行的方法/任务叫做UpdateUsers: 当计时器“滴答”, UpdateUsers方法(回调): 1.停止计时器 2.循环并为每个用户执行任务3.启动计时器
这样,您可以确保为每个用户执行任务,并且如果总共需要超过X小时,则不会重叠。更新将在每个Y时间发生,其中Y是您为计时器设置的时间间隔。此外,这将使用最多一个线程,具体取决于您的服务器/服务的编码方式。
答案 1 :(得分:0)
休眠线程通常不会影响CPU使用率。它们每个消耗1MB的堆栈内存。对于几十个线程来说,这不是什么大问题。对于5000个线程来说这是一个大问题。
有一个专门用于触发每小时工作的线程或计时器。每小时一次,您可以处理用户。如果需要,可以使用并行性。使用Parallel.ForEach
或您喜欢的任何其他技术处理用户。
无论您选择线程还是计时器,都无法以任何有意义的方式处理CPU使用情况。做最适合您使用的应用程序。