Вы могли бы использовать select? Обычно используется для ожидания завершения ввода-вывода, но посмотрите на подпись:
select.select(rlist, wlist, xlist[, timeout])
Итак, вы можете сделать что-то вроде:
timeout = 30.0
while true:
if select.select([], [], [], timeout):
#timout reached
# maybe you should recalculate your timeout ?