python:处理变量锁定的优雅方式?

Cla*_*diu 7 python multithreading locking thread-safety

我的代码看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

但它有点难看.大量的获取和发布.这看起来更漂亮:

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
Run Code Online (Sandbox Code Playgroud)

但这会使锁定的时间长于严格必要的时间,特别是如果self.logger.error需要一段时间(就像它写入磁盘一样).是否有尽可能少的锁定之间的中间地带,但有更漂亮的代码?

Odo*_*ois 6

也许你需要将这个逻辑分开:

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
Run Code Online (Sandbox Code Playgroud)

另外你告诉你searchingLock自动释放它的原因.