2016-10-06 35 views
0

我想同時運行兩個函數,直到它們都返回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

我認爲這將是最容易實現的,如果每個功能計時本身:

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