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