Unfortunately the only possibility to meet your constraints is to periodically poll, e.g....:
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
or the like. This can be optimized in several ways if somepredicate
can be decomposed (e.g. if it's known to be an and
of several clauses, especially if some of the clauses are in turn subject to optimization by being detectable via threading.Event
s or whatever, etc, etc), but in the general terms you ask for, this inefficient approach is the only way out.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…