code: async def update_queue(self):
          
  
          # For now, round-robin
          not_found_for_agent = []
  
          while len(self._available_agents) > 0 and len(self._waiting_jobs) > 0:
              agent_addr = self._available_agents.pop(0)
  
              # Find first job that can be run on this agent
              found = False
              client_addr, job_id, job_msg = None, None, None
              for (client_addr, job_id), job_msg in self._waiting_jobs.items():
                  if job_msg.environment in self._containers_on_agent[agent_addr]:
                      found = True
                      break
  
              if not found:
                  self._logger.debug("Nothing to do for agent %s", agent_addr)
                  not_found_for_agent.append(agent_addr)
                  continue
  
              # Remove the job from the queue
              del self._waiting_jobs[(client_addr, job_id)]
  
              job_id = (client_addr, job_msg.job_id)
              self._job_running[job_id] = (agent_addr, job_msg, time.time())
              self._logger.info("Sending job %s %s to agent %s", client_addr, job_msg.job_id, agent_addr)
              await ZMQUtils.send_with_addr(self._agent_socket, agent_addr, BackendNewJob(job_id, job_msg.course_id, job_msg.task_id,
                                                                                          job_msg.inputdata, job_msg.environment,
                                                                                          job_msg.enable_network, job_msg.time_limit,
                                                                                          job_msg.hard_time_limit, job_msg.mem_limit,
                                                                                          job_msg.debug))
  
          # Do not forget to add again for which we did not find jobs to do
          self._available_agents += not_found_for_agent
docs: Send waiting jobs to available agents