Как избежать ожидания завершения потока – Python

У меня есть следующая структура, определенная в Python –

введите описание изображения здесь

Есть два потока. Каждый поток сканирует ветвь вертикально вниз и печатает ее значение. По достижении конца этой ветви она перемещается на шаг вперед по горизонтальной оси. Например, Thread1 будет печатать a1, a2 и a3. В то же время Thread 2 сканирует b1. Когда оба выполнения завершают нить, Thread 1 перейдет к блоку B, и Thread 2 перейдет к блоку C, чтобы выполнить тот же процесс.

Когда все блоки выполнены, процесс начинается снова с самого начала. Я написал сценарий для того же –

def printTags(DevObj): if DevObj == None: return -1 TagObj = DevObj.tagPointer while TagObj != None: time.sleep(5) print TagObj.id TagObj = TagObj.nextTag import threading, thread # temp1 points to Block A. # temp2 points to Block B. while True: t1 = threading.Thread(target=printTags, args=(temp1,)) t2 = threading.Thread(target=printTags, args=(temp2,)) t1.start() t2.start() t1.join() t2.join() if temp1.nextDevice != None: temp1 = temp1.nextDevice else: temp1 = start.nextDevice if temp2.nextDevice != None: temp2 = temp2.nextDevice else: temp2 = start.nextDevice 

Однако вы можете видеть, что, когда потоки работают над блоками A и B, Thread 1 займет больше времени, чем Thread 2, поскольку он должен печатать больше значений. Из-за этого Thread 2 остается неиспользованным в течение некоторого времени. Я хочу избежать этого простои. Как я могу это сделать?

One Solution collect form web for “Как избежать ожидания завершения потока – Python”

Существуют различные подходы, которые вы можете предпринять, но я хотел бы указать на два из них:

Во-первых, используйте Семафор, этот как можно ближе к вашему коду, но на самом деле это не предпочтительнее:

 from threading import Semaphore def printTags(DevObj, s): ... s.release() ... import threading, thread # temp1 points to Block A. # temp2 points to Block B. s = Semaphore(0) threads = [ threading.Thread(target=printTags, args=(THING_TO_DO,s)) for THING_TO_DO in THINGS_TO_DO ] for t in threads: t.start() while True: s.aquire() for t in threads: # give more work 

Более предпочтительным вариантом является использование шаблона производителя / потребителя:

 from threading import Semaphore STOP = object() def printTags(queue): while True: thing_to_process = queue.get() if thing_to_process is STOP: return else: #process import threading, thread # temp1 points to Block A. # temp2 points to Block B. THREAD_COUNT = 2 s = Semaphore(0) threads = [ threading.Thread(target=printTags, args=(queue,)) for _ in xrange(THREAD_COUNT) ] for thing in things: queue.put(thing) for _ in xrange(THREAD_COUNT): queue.put(STOP) for t in threads: t.start() 
  • Scapy sniff () в классе, что подклассы threading.Thread ()
  • Процесс Python заблокирован urllib2
  • Как я могу дросселировать потоки Python?
  • многопроцессорные схемы графического интерфейса для борьбы с блокировкой «Неответ»
  • python, как постепенно создавать темы
  • Возвращаемое значение из потока
  • Остановка потока через определенное время
  • Почему экземпляр необходимо воссоздавать при перезапуске потока?
  • Python - лучший язык программирования в мире.