К сожалению, единственная возможность удовлетворить ваши ограничения - периодически опрос , например ....:
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.Event
s или что угодно, и т. д. и т. д.), но в общих чертах, которые вы просите, этот неэффективный подход - единственный выход.