Реализация потоков в Python с помощью модуля потоков - PullRequest
1 голос
/ 07 марта 2012

В программе на Python мне нужны 2 потока, основанные на модуле Threading.Поток № 1 генерирует некоторые данные и помещает их в буфер, а поток № 2 должен обрабатывать данные в буфере.

Итак, мой псевдокод выглядит так: Поток 1:

Thread#1
while True:
   Generate_Some_Data()
   while flag==1:
      pass()
   Buffer_Address=Write_It_To_Buffer()
   flag=1


Thread#2
while True:
   while flag==0:
      pass()
   Process_Data(Buffer_Address)
   flag=0

(Предположим, что доступ к переменной «flag» распределяется с помощью подходящих блокировок.)

Я знаю, что модуль Threading не является параллельным.По сути, это означает, что, если один из потоков не блокирует какие-либо внешние условия (например, file-io или time.sleep), оба потока будут совместно использовать общее время процесса независимо от задач.Поэтому, насколько я понимаю, примерно половина общего времени обработки будет потрачена на циклы «while» в указанной выше конфигурации.

Итак, вот мои вопросы:

  1. Прав ли я в своем ожидании / понимании модуля Threading?Половина общего времени процесса потрачена впустую в циклах "флаг"?

  2. (если я прав) Есть ли способ полностью избавиться от циклов "флаг"?Я попытался найти другую структуру, в которой я могу заставить потоки спать в методах lock.acquire (), однако я не смог найти безопасный способ сделать это на 100%.(Когда один поток передает блокировку, нет гарантии, что другой поток получит его до того, как тот же поток получит его снова)

1 Ответ

3 голосов
/ 07 марта 2012

Звучит так: модуль Queue - это то, что вам нужно.

Это даст вам блокирующую очередь FIFO.Всякий раз, когда поток потребителя получает что-то из очереди, если там ничего нет, он будет блокироваться, пока что-то не станет доступным, предоставляя потоку производителя время на создание чего-либо.В вычислительных циклах вы можете ограничить размер очереди.Если очередь заполнена, и потоку производителя есть, что добавить, он будет блокироваться, пока поток потребителя не извлечет что-то.

Вот некоторый псевдокод:

import Queue
q = Queue.Queue()

# Producer thread
while True:
    data = generate_some_data()
    q.put(data)

# Consumer thread
while True:
    data = q.get()
    process_data(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...