Untitled
unknown
python
a year ago
3.0 kB
6
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