Как получить требуемый вывод в Python?

Из документации :

Объект, переданный в директиву @synchronized, является уникальным идентификатором, используемым для выделения защищенного блока. Если вы выполняете предыдущий метод в двух разных потоках, передавая другой объект для параметра anObj в каждом потоке, каждый из них будет блокировать его и продолжить обработку, не будучи заблокированным другим. Однако, если вы передаете один и тот же объект в обоих случаях, один из потоков сначала получит блокировку, а другой будет блокироваться до тех пор, пока первый поток не завершит критический раздел.

blockquote>

Так что это зависит от то, что вы хотите защитить от выполнения одновременно, и есть приложения для всех трех случаев.

Например, в

-(void)addToMyArray1:(id)obj
{
    @synchronized(self) {
        [self.myArray1 addObject:obj];
    }
}

-(void)addToMyArray2:(id)obj
{
    @synchronized(self) {
        [self.myArray2 addObject:obj];
    }
}

оба блока @synchronized не могут быть выполнены одновременно два потока, вызывающие метод на одном и том же экземпляре (self), тем самым защищая одновременный доступ к массивам из разных потоков.

Но он также блокирует блок от первого метода которые будут выполняться одновременно с блоком из второго метода, потому что они используют один и тот же замок self. Поэтому для более мелкозернистой блокировки вы можете использовать разные блокировки:

-(void)addToMyArray1:(id)obj
{
    @synchronized(self.myArray1) {
        [self.myArray1 addObject:obj];
    }
}

-(void)addToMyArray2:(id)obj
{
    @synchronized(self.myArray2) {
        [self.myArray2 addObject:obj];
    }
}

Теперь одновременный доступ к self.myArray1 и self.myArray2 из разных потоков по-прежнему защищен, но независимо друг от друга.

Блокировка класса может использоваться для защиты доступа к глобальной переменной. Это просто тривиальный пример демонстрационных целей:

static int numberOfInstances = 0;

-(id)init
{
    self = [super init];
    if (self) {
        @synchronized([self class]) {
            numberOfInstances++;
        }
    }
}

-1
задан Amit 17 January 2019 в 04:41
поделиться

1 ответ

Похоже, вы пытаетесь решить проблему, которая пытается научить вас дескрипторам. Посмотрите https://docs.python.org/3.7/howto/descriptor.html для получения более подробной информации.

Но все, что нужно для задачи, для которой вы пишете решение:

class Celsius:
    def __get__(self, obj, objtype):
        return ((obj.fahrenheit - 32) * 5) / 9

    def __set__(self, obj, celcius):
        obj.fahrenheit = ((celcius * 9) / 5) + 32


class Temperature:
    celcius = Celsius()

    def __init__(self, fahrenheit=0):
        self.fahrenheit = fahrenheit

Обратите внимание на несколько важных различий с вашим кодом:

  • Celcius создан и непосредственно назначается celcius в классе, а не атрибуту в экземпляре Temperature, как в вашем случае.
  • Дескриптор выполняет преобразование в обоих направлениях без осложнений для класса Temperature.
  • Большая часть дополнительного кода в вашей реализации ничего не делала; как правило, если вы добавляете код для решения проблемы, не оставляйте его, если он не решает проблему. Меньше значит больше в программировании.
0
ответ дан Grismar 17 January 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: