Browse Source Download (without any required ccan dependencies)
lbalance
helpers for loadbalancing parallel tasks
Rusty Russell <rusty@rustcorp.com.au>
This code helps when you have a large number of one-shot tasks; it tries to determine the maximum amount of useful parallelism.
// Run 1000 of the given commandline at best-known parallel rate.
// See tools/lbalance.c for a sligtly more serious example.
#include <ccan/lbalance/lbalance.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <err.h>
#define MAX 1000
static pid_t spawn(char *args[])
{
pid_t pid = fork();
if (pid == -1)
err(1, "forking");
if (pid == 0) {
execvp(args[0], args);
err(1, "exec failed");
}
return pid;
}
int main(int argc, char *argv[])
{
unsigned int num = 0, num_running = 0;
pid_t pids[MAX];
struct lbalance_task *tasks[MAX];
struct lbalance *lb;
if (argc == 1)
errx(1, "Usage: %s cmdline...", argv[0]);
lb = lbalance_new();
while (num - num_running < MAX) {
struct rusage ru;
pid_t pid;
unsigned int i;
// Make sure we're running as many as lbalance says to.
while (num_running < lbalance_target(lb) && num < MAX) {
pids[num] = spawn(argv+1);
tasks[num] = lbalance_task_new(lb);
num++;
num_running++;
}
// Now wait for something to die.
pid = wait3(NULL, 0, &ru);
// Find it, tell lbalance it's finished.
for (i = 0; i < num; i++) {
if (pids[i] == pid) {
lbalance_task_free(tasks[i], &ru);
pids[i] = 0;
break;
}
}
num_running--;
}
lbalance_free(lb);
return 0;
}
GPL