'Yield a sequence of (socket, server_idx) tuples for each server which
should be forked-off and started.
Any sockets for "orphaned" ports no longer in any ring will be closed
(causing their associated workers to gracefully exit) after all new
sockets have been yielded.
The server_idx item for each socket will passed into the
:py:meth:`log_sock_exit` and :py:meth:`register_worker_start` methods.'

def new_worker_socks(self):

    self._reload_bind_ports()
    desired_port_index_pairs = set(((p, i) for p in self.bind_ports for i in range(self.servers_per_port)))
    current_port_index_pairs = self.port_pid_state.port_index_pairs()
    if (desired_port_index_pairs != current_port_index_pairs):
        orphan_port_index_pairs = (current_port_index_pairs - desired_port_index_pairs)
        missing_port_index_pairs = (desired_port_index_pairs - current_port_index_pairs)
        for (port, server_idx) in sorted(missing_port_index_pairs):
            if self.port_pid_state.not_tracking(port):
                try:
                    self._bind_port(port)
                except Exception as e:
                    self.logger.critical('Unable    to    bind    to    port    %d:    %s', port, e)
                    continue
            (yield (self.port_pid_state.sock_for_port(port), server_idx))
        for orphan_pair in orphan_port_index_pairs:
            self.port_pid_state.forget_port(orphan_pair[0])
