【问题标题】:One thread for many tasks vs many threads for each task. Do sleeping threads aftect the performance of the server?一个线程处理多个任务与每个任务多个线程。休眠线程会影响服务器的性能吗?
【发布时间】:2014-08-06 18:30:56
【问题描述】:

a) 我有一个任务,我希望服务器每 X 小时为每个用户(约 5000 个用户)执行一次任务。是否更好:

1 - 为每个执行任务的用户创建一个工作线程并休眠 X 小时然后重新启动,其中每个任务在随机时间运行(因此大多数任务每时每刻都在休眠)

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

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

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

【问题讨论】:

    标签: multithreading celery production-environment


    【解决方案1】:

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

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

    无论您选择线程还是计时器,对于 CPU 使用率而言都没有任何意义。做最适合您使用的应用程序。

    【讨论】:

      【解决方案2】:

      关于您的问题的详细信息不足,无法提供完整的答案。但是,根据您提供的信息,我会:

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

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

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

      【讨论】:

      • 停止计时器并不能确保将来可以调用回调。任意多个回调都可以排队。
      • 我的意思是在回调方法中停止计时器(已编辑)。我不明白什么是不正确的?
      • 停止计时器后,仍然可以调用回调。计时器不保护回调的并发调用。
      • 好的,我明白了。但是假设你在一个类中有这个计时器和回调;服务实例化一个类,计时器在构造函数中启动(或 StartTimer() 方法,无所谓)。一次只有一个实例,一个计时器,一个线程调用该方法。为什么并发访问会成为问题/风险?
      • 定时器事件被发布到线程池。不是一个线程,而是任意多个线程。如果同时调用,大多数代码都是不安全的。我同意你的大部分回答。我只是想指出这一点。
      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多