如何使用线程测量时间运行多个功能?

时间:2016-10-06 19:49:09

标签: python multithreading

我想同时运行两个函数,直到它们都返回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")

如何使用线程改进?

1 个答案:

答案 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))