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

标签 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

虽然有点丑。大量的获取和释放。这看起来更漂亮:

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

另外,您告诉您的 searchingLock 自动释放它的原因。

关于python:处理变量锁定的优雅方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3462566/

相关文章:

python - 按名称配色方案参数pycharm

python - 如何从 pandas 数据框中选择平均值大于某个限制的列?

multithreading - 从后台队列调用时,核心数据 NSManagedObjectContext 保存永远不会返回

mysql - cakephp 锁定表中的选择或如何防止重复

c - 多线程并行计数器比简单的基于并发锁的计数器慢

python - Selenium 服务器无法与 HTMLUnit 创建 session

python - Python中x的第n个根有简写吗?

java - 如何以多线程方式调用不同类的相同方法

c++ - Qt GUI 不能像我预期的那样与 std::thread 一起工作

sql-server - SQL Server 2012 : Running multiple UPDATE FROM SELECT on the same table simultaneously