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