【问题标题】:Threading: Complete N tasks in period T线程:在 T 周期内完成 N 个任务
【发布时间】:2018-03-08 17:57:54
【问题描述】:

目标:我有 n 个任务要在一段时间 t(比如 180 秒)内完成,每个任务大约需要 2 秒才能完成.任务必须在t期间均匀分布。

设置:我正在使用 Mininet 环境,它使用lightweight virtualization 来运行 Linux 主机。在我的设置中,我有 10 台主机。每个任务都与一个主机相关联(随机选择)。

到目前为止,我所做的是,我已将任务分配给 10 个主机(根据它们的关联)并在后台使用 random_sleep(小于 t)将它们安排在没有等待他们完成。

$ sleep random_duration && do_task &

但是,当 n 很大(> 2000)时,这会导致超过最大用户进程数。

或者,我想到了为每个主机创建一个线程并在前台一个一个地调度任务(在前一个完成后开始下一个)。但是,在这种方法中,我不能保证 n 个任务可以在 t 内完成。

解决这个问题的可扩展方法是什么?

【问题讨论】:

  • 我不清楚第二个问题:如果一个简单的、充分利用的调度不能保证任务完成——这似乎意味着这种情况没有可接受的解决方案:你也有在分配的时间内完成了许多任务。我看不出你在哪里失去周期。
  • 没错。如果完全使用调度不能满足任务总数,那么这意味着我必须同时调度一些任务,即 fork 一个新线程或进程。但是,从第一种情况,我们看到为每个任务分叉一个新进程太多了。所以我需要一种混合方法...
  • 哦...所以任务不会消耗 100% 的关键系统资源? 2 个任务的完成时间少于它们各自时间的总和?
  • 另外,任务是同质的——所有任务都需要相同的时间吗?它们是独立的,还是必须按给定的顺序运行?
  • 是的。如果它们同时开始,它们总共可以在约 2 毫秒内完成。不,它们不会单独消耗 100% 的关键系统资源。但是,同时调度 2000 个确实会导致系统崩溃。同时,它最多可以使用 200 个。这些任务是顺序无关的,每个任务花费大约相同的时间(大约几毫秒)

标签: python multithreading python-2.7 subprocess threadpool


【解决方案1】:

假设您可以以某种方式跟踪正在运行的任务的数量,那么我看到了一个解决方案。访问或硬编码 MAX_PROCESSES 限制。将所有进程放入队列(或任何集合)。如果n < MAX_PROCESSES(还有一些剩余用于正常的系统工作),那么您已经知道如何处理这项工作了。

如果n 太大,那么仍然计算调度间隔time_allowed * processor_count / n,但只调度第一个MAX_PROCESSES * ratio 任务,对于一些ratio processor_count(在您的示例中为 10),但舒适地少于MAX_PROCESSES

这能解决你的问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-05-13
    • 2011-06-05
    • 2015-10-23
    相关资源
    最近更新 更多