我需要在脚本中等待,直到满足一定条件为止?
我知道我可以使用条件变量和朋友来滚动自己的事件,但是我不想经历实现它的所有麻烦,因为某些对象属性更改来自包装的C 库(Boost.Python)中的外部线程,所以我不能只是劫持__setattr__一个类并在其中放置一个条件变量,这使我要么尝试从C 创建并发送一个Python条件变量,要么包装一个本机变量并在Python中等待它,这两种声音愚蠢的,不必要的复杂和无聊。
__setattr__
有没有更简单的方法来做到这一点,而无需持续轮询病情?
理想的情况是
res = wait_until(lambda: some_predicate, timeout) if (not res): print 'timed out'
不幸的是,满足您的约束的唯一可能性是定期 轮询 ,例如:
import time def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs): mustend = time.time() + timeout while time.time() < mustend: if somepredicate(*args, **kwargs): return True time.sleep(period) return False
或类似的东西。如果somepredicate可以分解,则可以通过多种方式进行优化(例如,如果它and是多个子句中的,尤其是某些子句又可以通过threading.Events或其他方法进行检测等进行优化),但是按照您所要求的一般术语,这种低效的方法是唯一的出路。
somepredicate
and
threading.Event