Untitled

 avatar
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