<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def _process_waiting_queue(self):
        ''' thread to processes the waiting queue
            fetches transfer spec
            then calls start transfer
            ensures that max ascp is not exceeded '''
        logger.info("Queue processing thread started")
        while not self.is_stop():
            self._processing_event.wait(3)
            self._processing_event.clear()
            if self.is_stop():
                break

            while self.waiting_coordinator_count() > 0:
                if self.is_stop():
                    break
                _used_slots = self.tracked_coordinator_count(True)
                _free_slots = self._config.ascp_max_concurrent - _used_slots
                if _free_slots <= 0:
                    break

                with self._lockw:
                    # check are there enough free slots
                    _req_slots = self._waiting_transfer_coordinators[0].session_count
                    if _req_slots > _free_slots:
                        break
                    _coordinator = self._waiting_transfer_coordinators.popleft()
                    self.add_transfer_coordinator(_coordinator)

                if not _coordinator.set_transfer_spec():
                    self.remove_aspera_coordinator(_coordinator)
                else:
                    logger.info("ASCP process queue - Max(%d) InUse(%d) Free(%d) New(%d)" %
                                (self._config.ascp_max_concurrent,
                                 _used_slots,
                                 _free_slots,
                                 _req_slots))
                    _coordinator.start_transfer()

        logger.info("Queue processing thread stopped")
        self._processing_stopped_event.set()