Implementation will vary widely depending on what kind of jobs they take and how much time they take, and how much processing time changes, and how fatal a mistake is during the process.
Thus, an easy way to maintain an even distribution of jobs among users is to maintain a list of all users who submitted jobs. When you are ready to get a new job, and not just do the next job from a random queue, banish the users, each time taking the top job from each user.
Again, this can be done in several ways, I would recommend a map from users to their respective list of submitted tasks. Sort through the card keys every time you are ready for a new task. then get a list of tasks for any key you are on, and complete the first task.
This assumes that each task is βatomicβ in that one task does not depend on the execution next to the tasks with which it was sent.
Hope this helps, of course, I could completely misunderstand what you are asking.
source share