【发布时间】:2012-03-17 10:37:05
【问题描述】:
我需要限制并行执行的进程数。例如我想执行这个伪命令行:
export POOL_PARALLELISM=4
for i in `seq 100` ; do
pool foo -bar &
done
pool foo -bar # would not complete until the first 100 finished.
因此,尽管有 101 个 foos 排队等待运行,但在任何给定时间只有 4 个在运行。 pool 将 fork()/exit() 并将剩余进程排队直到完成。
有没有一种简单的机制可以用 Unix 工具来做到这一点? at 和 batch 不适用,因为它们通常在每分钟的顶部调用并按顺序执行作业。使用队列不一定是最好的,因为我希望这些是同步的。
在我编写一个使用信号量和共享内存的 C 包装器,然后调试我肯定会介绍的死锁之前,任何人都可以推荐一个 bash/shell 或其他工具机制来完成此任务。
【问题讨论】:
-
你想要完成什么?您在此处陈述的机制听起来可能不是您可能遇到的问题的正确解决方案。
-
有某个TCP端口连接饿的程序。当它运行时,它会建立数百个出站连接。它由 HTTP CGI 请求触发。通常不是问题,但如果我可以限制在任何给定时间被调用的这些连接的数量(即使它们阻塞一小段时间),这将有助于管理所述连接(网络管理员讨厌这个应用程序)。
-
你最好把所说的程序变成一个带有作业队列的事件驱动的单一服务器——它会从根本上降低你的整体负载。谷歌搜索“C10K 问题”,详细了解为什么这是一个常见问题。
-
您是说对于任何给定的 CGI 请求,您希望最多同时运行四个
foo -bar实例吗?或者您是说在所有 CGI 请求中,您希望最多同时运行四个foo -bar实例? -
@ruakh,不是针对每个 CGI 请求,仅针对这个特定的 CGI 程序(它从大量数据源创建图表)。它的数量很少,但是当员工早上来时,他们都会同时出现,并且会产生数千个连接。我不能在 TCP 或 HTTP 级别进行节流,因为这会影响站点的其余部分。所以我想我可以包装这个 CGI 程序并绑定这个 CGI 程序的所有请求中发生多少并发请求(你的后一种情况)
标签: bash unix process queue pool