python: как заставить потоки ждать определенного ответа? - PullRequest
0 голосов
/ 04 ноября 2010

Может ли кто-нибудь сообщить, как выполнить следующий сценарий?

2 очереди - очередь назначения, очередь ответов
поток выбирает задачу из очереди назначения
выясняет потребности в более подробной информации
отправляетновая задача в очередь назначения
ожидает обработки своего запроса, и результат появляется в очереди ответов
или
отслеживает очередь ответов для ответа на его задачу, но фактически не выбирает какой-либо ответ, поэтому он доступен для другоготемы ждут других ответов?

спасибо

1 Ответ

1 голос
/ 04 ноября 2010

Если поток ожидает завершения определенной задачи, то есть он не должен выбирать какую-либо завершенную задачу, кроме той, которую он поставил, вы можете использовать блокировки для ожидания задачи:

  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 очередей. Группа потоков обслуживает первую очередь, получает задачу, обрабатывает ее, помещает результат (новую задачу) в следующую очередь. Группа конечных потоков обработчика ответа получает ответ и отправляет его обратно клиенту. Задачи заключают в себе детали, касающиеся самих себя, потоки не отличают задачу от другой. И не нужно ждать конкретной задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...