2012-03-02 51 views
0

我在開發一個用於返回用戶函數的數據的標準時遇到了問題,這些用戶函數在作爲單獨線程運行該函數的類中傳遞和執行。區分用戶函數返回和包裝類返回

目標是在用戶請求時從函數傳遞返回參數。

但是,如果當用戶從我的班級請求數據時功能沒有完成運行會怎樣?或者,如果函數失敗,因此沒有數據(但其失敗不是關鍵的程序,這意味着引發異常是過度)

我曾想過只返回None,但如果用戶函數返回None,那是什麼有意義的(即功能成功完成)?我的下一個想法是在列表中返回函數輸出,如果沒有數據準備好或可用,則返回None。這意味着用戶將不得不檢查數據是否被返回(檢查無或列表),我發現這些數據稍微不雅。

我很好奇,如果已經有這樣的事情的標準,或者如果有人有一個更清潔的建議。

例如:

用戶呼叫

def foo(): 
    #...do lots of stuff that takes long time 

    # return whether stuff worked or not (None if worked False if not) 
    return success 

takes_forever = detach(foo) 

# ... do other things 

# get data from detached function which has hopefully completed 
are_you_done = takes_forever.give_me_data() 

我的類:

class detach: 
    def __init__(self, func): 
     self.detached_func = execute_as_thread(func) 

    def give_me_data(self) 
     if self.detached_func.is_done():  # function completed and didnt die 
      return [self.detached_func.output] 
     else:         # something went wrong or function is still running 
      return None 
+0

你可以嘗試在字典中傳遞返回,也許。 'return {'success':success,'origin':origin ... etc等}} – 2012-03-02 20:41:13

回答

1

最好將引發異常,如果由於某種原因你想避免例如返回sepecial對象定義一個類NoResultsType並返回這樣的類型的對象或可能只是類

class NoResultsType(object): pass 

NoResults = NoResultsType() 

def give_me_data(self) 
    if self.detached_func.is_done():  # function completed and didnt die 
     return [self.detached_func.output] 
    else:         # something went wrong or function is still running 
     return NoResults 

然後可以例如定義多個這樣的類型NoResults,FunctionFailed等用戶可以檢查他們,例如

ret = foo.give_me_data() 
if ret in [NoResultsYet, FunctionFailed]: 
    # do something 

,或者你可以返回一個結果對象,可保持原來的結果,等

class Result(object): 
    def __init__(self): 
     self.finished = False 
     self.success = False 
     self.error = "" 
     self.result = None 

res = foo.give_me_data() 
if res.success: 
    print res.result 
+0

想了很多,我同意最好只引發一個異常。 – 2012-03-05 15:10:05

0

規定你可以在你的分離類使用兩種方法:

is_finished() 告訴你是否仍在執行函數調用。

get_data() 將得到你的detached_func的返回值。如果功能還沒有完成,它會阻塞,直到功能完成。

我不知道任何python標準,但你可以看看Java的Future類,它包裝了異步執行任務的結果。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html