许多任务的一个线程与每个任务的多个线程。睡眠线程会影响服务器的性能吗?

时间:2014-08-06 18:30:56

标签: multithreading celery production-environment

a)我有一项任务,我希望服务器每隔X小时为每个用户(~5000个用户)做。是否更好:

1 - 为执行任务的每个用户创建一个工作线程,然后休眠X小时,然后重新开始,每个任务在随机时间运行(这样大多数任务都会在每个时刻都处于休眠状态)

2 - 创建一个循环用户的线程,为每个用户执行任务,然后重新开始(即使这需要超过X小时)。

b)如果使用计划1,那么睡眠线程是否会影响服务器的性能? c)如果答案是肯定的,那么休眠线程是否与执行任务的线程具有相同的效果?

请注意,此服务器不仅用于此任务。它用于与~5000个客户的所有通信。

2 个答案:

答案 0 :(得分:0)

关于您的问题,没有足够的详细信息可以获得完整的答案。但是,根据您提供的信息,我会:

  • 创建一个计时器(threading.timer)
  • 设置一个间隔,该间隔将是处理5,000个用户的“批次”之间的时间间隔

然后说你想要执行的方法/任务叫做UpdateUsers: 当计时器“滴答”, UpdateUsers方法(回调):  1.停止计时器  2.循环并为每个用户执行任务3.启动计时器

这样,您可以确保为每个用户执行任务,并且如果总共需要超过X小时,则不会重叠。更新将在每个Y时间发生,其中Y是您为计时器设置的时间间隔。此外,这将使用最多一个线程,具体取决于您的服务器/服务的编码方式。

答案 1 :(得分:0)

休眠线程通常不会影响CPU使用率。它们每个消耗1MB的堆栈内存。对于几十个线程来说,这不是什么大问题。对于5000个线程来说这是一个大问题。

有一个专门用于触发每小时工作的线程或计时器。每小时一次,您可以处理用户。如果需要,可以使用并行性。使用Parallel.ForEach或您喜欢的任何其他技术处理用户。

无论您选择线程还是计时器,都无法以任何有意义的方式处理CPU使用情况。做最适合您使用的应用程序。