Программирование прописки в тупиках учи ру ответы

Эта статья фокусируется на том, как получить более одной блокировки за раз. Если многопоточная программа дается вместе с избеганием тупиков.
Многопоточные программы – Из-за потоков, которые продолжают пытаться получить несколько блокировок одновременно. Они очень склонны к тупикам. Понимание этого с помощью примера – блокировка уже получена потоком. А затем блок пытается выполнить вторую блокировку. Тогда в этом случае программа может заморозить. Так как поток потенциально может блокировать прогресс других потоков.

Решение:

  • Обеспечение выполнения предписания
  • Назначение каждой блокировки уникальным образом программе.

  • Позволяет получать несколько блокировок только в порядке возрастания.

Код №1 : Реализация решения с помощью контекстного менеджера.

import threading

from contextlib import contextmanager

  

_local = threading.local()

  

@contextmanager

def acquire(*lock_state_state):

      

    

    lock_state_state = sorted(lock_state_state, key = lambda a: id(a))

      

    

    acquired = getattr(_local, 'acquired', [])

    if acquired and max(id(lock_state) for 

                        lock_state in acquired) >= id(lock_state_state[0]):

        raise RuntimeError('lock_state Order Violation')

          

    

    acquired.extend(lock_state_state)

    _local.acquired = acquired

      

    try:

    for lock_state in lock_state_state:

        lock.acquire()

    yield

    finally:

          

        

        for lock_state in reversed(lock_state_state):

            lock_state.release()

        del acquired[-len(lock_state_state):]

Блокировки приобретаются обычным способом с помощью контекстного менеджера и для выполнения этой задачи acquire()используется функция так как было несколько блокировок как показано в приведенном ниже коде :

Код № 2 :

import threading

  

lock_state_1 = threading.Lock()

lock_state_2 = threading.Lock()

  

def thread_1():

    while True:

        with acquire(lock_state_1, lock_state_2):

            print('Thread-1')

  

def thread_2():

    while True:

        with acquire(lock_state_2, lock_state_1):

            print('Thread-2')

              

t1 = threading.Thread(target = thread_1)

  

t1.daemon = True

t1.start()

  

t2 = threading.Thread(target = thread_2)

t2.daemon = True

t2.start()

  • Даже после приобретения спецификации блокировок в разном порядке в каждой функции – программа будет работать вечно без взаимоблокировки.
  • Сортировка блокировок играет важную роль в соответствии с идентификатором объекта. Поскольку блокировки после сортировки приобретаются согласованным образом независимо от того. Как пользователь мог бы предоставить их для получения().
  • Если несколько потоков вложены, как показано в приведенном ниже коде. Для решения тонкой проблемы с обнаружением потенциальной тупиковой ситуации используется локальное хранилище потоков.

Код № 3 :

# threads

import threading

  

# creating locks

lock_state_1 = threading.Lock()

lock_state_2 = threading.Lock()

def thread_1():

      

    while True:

    with acquire(lock_state_1):

        with acquire(lock_state_2):

            print('Thread-1')

              

def thread_2():

    while True:

        with acquire(lock_state_2):

            with acquire(lock_state_1):

                print('Thread-2')

                  

t1 = threading.Thread(target=thread_1)

# daemon thread runs without blocking

# the main program from exiting

t1.daemon = True

t1.start()

  

t2 = threading.Thread(target=thread_2)

t2.daemon = True

t2.start()

При запуске этой версии программы один из потоков завершит работу с таким исключением, как :

Исключение в потоке Thread-1: Traceback (последний последний вызов): Файл Файл Файл Файл Файл RuntimeError: Нарушение Порядка блокировки

Каждый поток помнит, что блокировка уже была получена, поэтому он показывает эту ошибку. Ограничения упорядочения, которые приобрели блокировки, также применяются. И список ранее приобретенных блокировок проверяется acquire()методом.

Внимание, выродок! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.

Начнем с того. Что подготовка к собеседованию Улучшит ваши представления о структурах данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинного обучения – Базовый уровень