python: как заставить потоки ждать определенного ответа?

Может ли кто-нибудь рассказать о том, как достичь сценария ниже?

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

Спасибо


person m1k3y3    schedule 04.11.2010    source источник


Ответы (1)


If a threads waits for a specific task completion, i.e it shouldn't pick any completed task except that one it put, you can use locks to wait for the task:

  def run(self):
    # get a task, do somethings, put a new task
    newTask.waitFor()
    ...

задача класса: ... def waitFor(self): self._lock.acquire()

защита завершена (я): self._lock.release ()

def failedToComplete(self, err): self._error = err self._lock.release()

Это поможет избежать time.sleep()-s при мониторинге очереди ответов. Здесь следует рассмотреть обработку ошибок завершения задачи. Но это нестандартный подход. Это какой-то определенный алгоритм, где поток, который ставит новую задачу, должен ждать ее? Тем не менее, вы можете реализовать эту логику в классе Task, а не в потоке, который ее обрабатывает. И почему поток выбирает задачу из очереди назначения и помещает новую задачу обратно в очередь назначения? Если у вас есть n шагов обработки, вы можете использовать для этого n очередей. Группа потоков обслуживает первую очередь, получает задачу, обрабатывает ее, помещает результат (новую задачу) в следующую очередь. Группа конечных потоков-обработчиков ответов получает ответ и отправляет его обратно клиенту. Задачи инкапсулируют сведения о себе, потоки не отличают одну задачу от другой. И нет необходимости ждать конкретной задачи.

person khachik    schedule 04.11.2010
comment
позвольте мне дать более подробную информацию. есть 2 пары очередей назначения и ответа и 2 группы потоков. один отвечает за извлечение данных, а другой обрабатывает данные, НО может быть случай, когда потоку из группы обработки может потребоваться больше данных для выполнения своей задачи. Таким образом, он помещает запрос в очередь назначения данных и должен получить правильный ответ, иначе он не сможет его правильно обработать. доступ к источнику данных должен быть ограничен, поэтому поток обработки не может самостоятельно получать дополнительные данные. Имеет ли это смысл? - person m1k3y3; 04.11.2010
comment
@ m1k3y02 Да, спасибо. В этом случае вы должны реализовать некоторый метод waitFor, который блокирует и ожидает данные, а поток обработки должен вызывать этот метод после того, как он помещает задачу обратно в очередь назначения. Хотя мне непонятно, почему бы не разделить обработку на два шага: 1. получить задание, сделать что-то, поставить в очередь сбора данных, если нужны дополнительные данные, и в противном случае ответить. 2. другие потоки отслеживают очередь сбора данных, обрабатывают задачи, помещают их в очередь ответов. Но вы можете знать причину. - person khachik; 04.11.2010
comment
на самом деле я думал об открытии 1 потока для 1 задачи, с другой стороны, разделение может быть более разумным. Спасибо :-) - person m1k3y3; 04.11.2010