I agree with BrowserUK’s sentiment that a simple polling loop (with a substantial sleep() delay between each iteration, and an appropriately long or short interval) is the simplest approach in this case. If, in actual practice, a simple poll keeps the work-to-do list reasonably full most of the time, “you’re done.” If the feeder process “wastes” a few dozen microseconds every thousand, and in the process it avoids a more complicated timing mechanism ... so what ... it’s a “waste” that you can afford. Even if, every now and then, “the well runs dry,” but the total waste is not a significant delay to the business operation that it supports ... you can afford the simplicity.