我有一段代码试图暂停特定操作。我有一个暂停应用程序的方法和另一个方法,它在一定的超时值后恢复应用程序。为了达到这个目的,我有一个计时器线程,它运行一段固定的时间间隔。
考虑下面的方法 -
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继续进行,因为它已经被服务。结果,第二次暂停呼叫没有任何效果,它的计时器将被第一次暂停的超时呼叫取消。
知道如何解决这个问题?
答案 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
这不应该影响性能,因为一次几乎总是只有一个计时器。