Untitled
unknown
python
6 months ago
3.0 kB
2
Indexable
import threading as th import time sem_point_1 = th.Semaphore(1) # Семафор для контрольной точки 1 sem_point_2 = th.Semaphore(3) # Семафор для контрольной точки 2 sem_point_3 = th.Semaphore(3) # Семафор для контрольной точки 3 sem_point_4 = th.Semaphore(3) # Семафор для контрольной точки 4 def execute_thread(thread_name, semaphore, next_steps=None): """ Функция для выполнения потока с использованием семафора. :param thread_name: Имя текущего потока :param semaphore: Семафор для синхронизации :param next_steps: Список следующих шагов (потоков) для выполнения """ print(f"Поток '{thread_name}' запущен и ожидает доступ к семафору.") semaphore.acquire() # Ожидаем доступ к семафору print(f"Поток '{thread_name}' захватил семафор и выполняется.") time.sleep(3) # Эмуляция работы потока print(f"Текущее значение семафора: {semaphore._value}. Поток '{thread_name}' освобождает семафор.") semaphore.release() # Освобождаем семафор # Если есть следующие шаги, запускаем их if next_steps: for next_step in next_steps: next_step.start() for next_step in next_steps: next_step.join() # Ждем завершения всех следующих шагов def start_threads(): """ Основная функция для инициализации и запуска всех потоков. """ # Инициализация дерева потоков начиная с потока A thread_A = th.Thread(target=execute_thread, args=('A', sem_point_1, [ th.Thread(target=execute_thread, args=('B', sem_point_2, [ th.Thread(target=execute_thread, args=('D', sem_point_3, [ th.Thread(target=execute_thread, args=('G', sem_point_4, [ th.Thread(target=execute_thread, args=('K', sem_point_4)) ])), th.Thread(target=execute_thread, args=('H', sem_point_4)) ])), th.Thread(target=execute_thread, args=('E', sem_point_3)), th.Thread(target=execute_thread, args=('F', sem_point_3)) ])), th.Thread(target=execute_thread, args=('C', sem_point_2)), th.Thread(target=execute_thread, args=('J', sem_point_2)), th.Thread(target=execute_thread, args=('I', sem_point_1, [ th.Thread(target=execute_thread, args=('I', sem_point_4)) ])) ])) thread_A.start() thread_A.join() if name == "main": start_threads()
Editor is loading...
Leave a Comment