时间:2015-08-04 09:53:05

标签: python python-multithreading

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

考虑下面的方法 -

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中有两个位置可以暂停。因此,在暂停方法中检查计时器。

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

知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以创建一个递增pause_my_operation()并递减pausetimeout()的变量。然后,pausetimeout()只有在递减变量为0后才会执行其逻辑。使用此逻辑,只有最后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

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