python: элегантный способ справиться с блокировкой переменной?

У меня есть код, который выглядит примерно так:

def startSearching(self):
    self.searchingLock.acquire()
    searching = self.searching
    if self.searching:
        self.searchingLock.release()
        self.logger.error("Already searching!")
        return False

    self.searching = True
    self.searchingLock.release()

    #some more init code, then start the thread which
    #constantly checks self.searching to determine when to stop

хотя это немного уродливо. много приобретений и релизов. это выглядит красивее:

def startSearching(self):
    with self.searchingLock:
        if self.searching:
            self.logger.error("Already searching!")
            return False

        self.searching = True

    #some more init code, then start the thread which
    #constantly checks self.searching to determine when to stop

, но при этом блокировка длится дольше, чем строго необходимо, особенно если self.logger.error занимает некоторое время (как, например, запись на диск, что и происходит). есть ли среднее заземление между удержанием замка как можно меньше, но с более красивым кодом?

7
задан alain.janinm 30 April 2012 в 20:19
поделиться

2 ответа

Возможно, вам нужно разделить эту логику следующим образом:

def initSearch(self):
    with self.searchingLock:
        if self.searching : raise SearchingError('AlreadySearching')
        self.searching = True
def startSearching(self):
    try: self.initSearch()
    except SearchingError as error :
        self.logger.error(error.message)
        return False
    #some more init code, then start the thread which
    #constantly checks self.searching to determine when to stop

И дополнительно вы сообщаете своему searchLock причину для автоматического освобождения.

6
ответ дан 7 December 2019 в 03:09
поделиться

Это сэкономит вам одно "self.searchingLock.release()" Полагаю, это не очень питонично или что-то в этом роде, но это делает свою работу

def startSearching(self):
    self.searchingLock.acquire()
    already_searching = self.searching
    self.searching = True # Since it'll be true in both scenarios 
    self.searchingLock.release()

    if already_searching:
        self.logger.error("Already searching!")

    return not already_searching
1
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

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