Page 85 - 6734
P. 85

self.i=i # ідентифікатор потоку
                   threading.Thread.__init__(self) # виклик
           конструктора базового класу
               def run(self): # забезпечує логіку потоку
                   mutex.acquire() # блокувати (лише один потік
           може виконуватись в один і той самий момент часу)
                   #semaphore.acquire() # або так
                   A.append(self.i)
                   time.sleep(1)
                   A.append(self.i)
                   mutex.release() # розблокувати
                   #semaphore.release() # або так

           mutex = threading.Lock() # те саме що
           thread.allocate_lock()
           #semaphore=threading.Semaphore(1) # або семафор
           (тільки 1 потік одночасно)
           A=[] # глобальний список
           T=[] # список потоків
           for i in range(4): # створити 4 потоки
               t=Thread(i) # створити потік
               t.start() # виконати метод run в потоці
               T.append(t) # додати в список потоків
           t = threading.Timer(2.0, lambda: A.append('timer')) #
           створити потік,
           t.start() # який стартує через 2 с
           T.append(t)
           for t in T:
               t.join() # поки усі потоки не приєднаються
           print A
           [0, 0, 1, 'timer', 1, 2, 2, 3, 3]
           [0, 1, 2, 3, 2, 3, 1, 0, 'timer']




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