Page 84 - 6734
P. 84

time.sleep(1)
               A.append(i)
               mutex.release() # розблокувати
               T[i]=1 # повідомити головному потоку, що потік
           завершився
           A=[] # глобальний список
           T=[0,0,0,0] # глобальний список (якщо потік `i`
           завершився, то T[i]=1)
           mutex = thread.allocate_lock() # створити блокуючий
           об'єкт
           for i in range(4): # створити 4 потоки
               thread.start_new(f, (i, )) # стартувати потік 'i'
           while 0 in T: # поки усі потоки не приєднаються
               pass # тут головний потік може робити щось своє
           print A

           [0, 0, 1, 1, 2, 2, 3, 3]
           [0, 1, 2, 3, 1, 3, 2, 0]

                    threading – високорівневий інтерфейс потоків
               Цей  модуль  створює  високорівневі  інтерфейси  потоків  на
           основі низькорівневого модуля thread [5, 19]. Потоки описуються
           нащадком  класу  threading.Thread,  а  їхня  активність  –
           перевизначеним  методом  run.  У  прикладі  створюються  4  потоки,
           які виконуюють код у методі run. Звернення потоків до спільного
           списку  A  синхронізовано  за  допомогою  простого  об’єкта
           блокування  threading.Lock.  Нижче  показані  результати  роботи
           програми з цим об’єктом і без нього. Додатково створюється потік,
           який стартує через 2 секунди і додає в список A рядок ‘timer’.

           import threading, time

           class Thread(threading.Thread): # успадкований від
           threading.Thread
               def __init__(self, i): # конструктор

                                          83
   79   80   81   82   83   84   85   86   87   88   89