Python - Лучшие практики для постановки в очередь / удаления потоков - PullRequest
1 голос
/ 19 июля 2011

У меня есть очередь, которая может содержать до 4 объектов в очереди. Эти объекты являются потоками, выполняющими запросы веб-службы. Часть потока в порядке. Я следовал многим учебным пособиям, в которых рассказывается о потоках потребителя и производителя, используемых для заполнения и исключения объекта очереди. Мой вопрос о потребительской части. Во всех этих уроках и в отношении документации по питону единственный способ найти объекты из очереди - это:

while len(requltArray) < amountOfThreads:
    thread = q.get(True)
    thread.join()

Представьте, что q.get (True) накапливает поток с неверным запросом веб-службы. И представьте, что этот поток должен дождаться истечения времени ожидания urllib. Мой потребитель будет заблокирован на несколько секунд. Поскольку моя очередь ограничена четырьмя потоками и, может быть, еще три других закончились, я теряю время, пока потребитель не сможет продолжить сборы (и производитель сможет заполнить очередь).

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

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 19 июля 2011

Возможно, вы могли бы использовать условия

Представьте, что вы хотите добавить новый поток в свою очередь, но он заполнен.Затем вы можете подождать () для объекта условия (псевдокод):

condition.acquire()
while not queue.has_free_place():
    condition.wait()
add_new_thread_to_queue()
condition.release()

И внутри ваших потоков в очереди вы можете поместить что-то вроде следующего кода в конце выполнения:

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