【发布时间】: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