У меня есть код, который выглядит примерно так:
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
занимает некоторое время (как, например, запись на диск, что и происходит). есть ли среднее заземление между удержанием замка как можно меньше, но с более красивым кодом?
Возможно, вам нужно разделить эту логику следующим образом:
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
причину для автоматического освобождения.
Это сэкономит вам одно "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