2012-03-02 19 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

おそらく、dictで返品を試すことができます。 'return {'success':成功、 'origin':origin ...など...}' –

答えて

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など、ユーザーはそれらを確認するだけで済みます。 is_finished

() を指示します:

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

たり、オリジナルの結果を保つことができる結果オブジェクトを返すことができますが、あなたはあなたのデタッチクラス上の2つのメソッドを使用することができますなど

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

それについてもっと考えてみたら、例外を発生させるのが一番良いと私は同意します。 –

0

述べて関数呼び出しがまだ実行されているかどうかを確認します。

get_data() detached_funcの戻り値を取得します。機能がまだ終了していない場合は、機能が終了するまでブロックされます。

私は、任意のPythonの標準を知らないが、あなたは非同期で実行されるタスクの結果をラップし、Javaの今後のクラスで見ることができます。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html