我想同时运行两个函数,直到它们都返回True,最多60秒超时。
这就是我所拥有的:
import time
start_time = time.time()
timeout = time.time() + 60
a_result = b_result = False
a_end_time = b_end_time = None
a_duration = b_duration = None
while time.time() < timeout :
if not a_result:
a_result = func_a()
if a_result:
a_end_time = time.time()
if not b_result:
b_result = func_b()
if b_result:
b_end_time = time.time()
if a_result and b_result:
break
if a_end_time:
a_duration = a_end_time - start_time
if b_end_time:
b_duration = b_end_time - start_time
print a_duration,b_duration
if not (a_result and b_result):
raise Exception("exceeded timeout")
如何使用线程改进?
答案 0 :(得分:0)
我认为如果每个函数都自行计时,最容易实现:
import random
import time
import threading
MAX_TIME = 20
a_lock, b_lock = threading.Lock(), threading.Lock()
a_result = b_result = False
a_duration = b_duration = None
def func_a():
global a_result, a_duration
start_time = time.time()
time.sleep(random.randint(1, MAX_TIME)) # do something...
a_duration = time.time() - start_time
with a_lock:
a_result = True
def func_b():
global b_result, b_duration
start_time = time.time()
time.sleep(random.randint(1, MAX_TIME)) # do something...
b_duration = time.time() - start_time
with b_lock:
b_result = True
th1 = threading.Thread(target=func_a)
th1.deamon = True
th2 = threading.Thread(target=func_b)
th2.deamon = True
th1.start()
th2.start()
timeout = time.time() + MAX_TIME
while time.time() < timeout:
if a_result and b_result:
break
if not (a_result and b_result):
raise Exception("exceeded timeout")
print('func_a: {} secs, func_b: {} secs'.format(a_duration, b_duration))