Если поток ожидает завершения определенной задачи, то есть он не должен выбирать какую-либо завершенную задачу, кроме той, которую он поставил, вы можете использовать блокировки для ожидания задачи:
def run(self):
# get a task, do somethings, put a new task
newTask.waitFor()
...
class Task:
...
def waitFor(self):
self._lock.acquire()
def complete(self):
self._lock.release()
def failedToComplete(self, err):
self._error = err
self._lock.release()
Это поможет избежать time.sleep()
-s при мониторинге очереди ответов. Обработка ошибок завершения задачи должна быть рассмотрена здесь. Но это необычный подход. Это какой-то конкретный алгоритм, где поток, который ставит новую задачу, должен ждать ее? Тем не менее, вы можете реализовать эту логику в классе Task, а не в потоке, который его обрабатывает. И почему поток выбирает задачу из очереди назначения и помещает новую задачу в очередь назначения? Если у вас есть n шагов обработки, вы можете использовать для этого n очередей. Группа потоков обслуживает первую очередь, получает задачу, обрабатывает ее, помещает результат (новую задачу) в следующую очередь. Группа конечных потоков обработчика ответа получает ответ и отправляет его обратно клиенту. Задачи заключают в себе детали, касающиеся самих себя, потоки не отличают задачу от другой. И не нужно ждать конкретной задачи.