带锁的python问题

我有一段代码试图暂停特定的操作。 我有一个暂停应用程序的方法和另一个方法,它在一定的超时值后恢复应用程序。 为了达到这个目的,我有一个计时器线程,它运行一段固定的时间间隔。

考虑下面这样的方法 -

def pause_my_operation():
     with self._lock:
         # check if there is already an existing timer, if present then cancel the timer and start a new timer
         # pause the operation

def pausetimeout():
    with self._lock:
        # check if there is already an existing timer, if present then cancel it.
        # resume the operation

该操作在UI中有两个位置可以暂停。 因此,在暂停方法中检查计时器。

现在,我面临的问题是这两个函数之间可能存在竞争。如果第一次暂停被提前一段时间触发它即将过期,即第一次暂停的pausetimeout刚刚进入方法,但在获取之前在锁定时,UI会进行第二次调用以暂停操作,即调用pause_my_operation并获取锁定。 第二个pause_my_operation将简单地设置一个内部事件来标记已取消的计时器,但这可能不会停止pausetimeout继续进行,因为它已经被服务。 因此,第二次暂停调用将没有任何效果,并且它的计时器将被第一次暂停的超时调用取消。

知道如何解决这个问题?

采纳答案:

您可以创建一个变量,该变量由pause_my_operation()递增,并由pause_my_operation()递减。 然后,如果在递减后变量为0,则pausetimeout()将仅执行其逻辑。使用此逻辑,只有最后一个pausetimeot()将恢复代码。

例如:

def pause_my_operation():
     with self._lock:
         self._counter += 1
         # check if there is already an existing timer, if present then cancel the timer and start a new timer
         # pause the operation

def pausetimeout():
    with self._lock:
        self._counter -= 1
        if self._counter == 0:
            # check if there is already an existing timer, if present then cancel it.
            # resume the operation

编辑

显然,这样你会遇到另一个问题:如果取消定时器而不减少值,那么清理代码永远不会触发。 要解决这个问题,你应该永远不要取消旧计时器,如果可能的话,即:

def pause_my_operation():
     with self._lock:
         self._counter += 1
         # start a new timer
         # pause the operation

def pausetimeout():
    with self._lock:
        self._counter -= 1
        if self._counter == 0:
            # resume the operation

这不应该影响性能,因为一次几乎总是只有一个计时器。


参考更多解答: A python issue with locks ,转载请保留出处带锁的python问题及作者信息

Statement: We respect knowledge and authors. Since the content comes from the Internet and is intended for scientific research, any reprinters should retain the author's signature and origin. If you are the author of the content and feel in dispute, please contact email: 1076545519@qq.com. We will find out the situation and deal with it in time. We sincerely thank the author for his hard work.


更多:python-multithreading