2012-05-25 19 views
0

我遇到了问题。 这样吧, 函数正常返回单个结果。我想要的是它在特定时间范围内返回连续的结果流(可选)。单个函数调用返回连续结果

函数重复返回单个函数调用的结果是否可行?

通过网络浏览时,我遇到了gevent和线程。如果有的话,它会起作用如何解决它?

我只需要调用该函数工作的开展和各项任务完成后立即返回结果。

+0

你可以将函数重新编程为[generator](http://www.linuxtopia.org/online_books/programming_books/python_programming/python_ch18.html)吗? –

+0

我不确定我是否完全理解了这个问题。你是否在寻找某种非阻塞的函数调用,并在函数有一些有趣的事情来通知调用者时得到通知? – Vikas

+0

阅读['yield'](http://docs.python.org/reference/simple_stmts.html#yield)和[coroutines](http://en.wikipedia.org/wiki/Coroutine)。 – phg

回答

0

你GEVENT和线程在正确的轨道上,因为一个函数做什么编程做,要么接受每次1个变种或采取一组并返回或者一组或一个变种。该函数被调用返回无论结果和处理的连续流可能发生已经要不你问一个遍历内核指针或类似的东西,你都没有,所以...

所以,你调用代码,它封装你的函数是很重要的,功能,任何功能,例如,即使是真/假布尔函数只执行,直到它与它的增值经销商完成的,所以MUSE是监听无限通话功能在你的情况。如果它不存在,你应该写一个;)

它封装调用的代码肯定是非常重要的。

人们没有足够的信息来帮助我们,除非我们可以告诉你,你是或者应该在某个框架的事件循环中,或者其他代码的某些形式的循环已经存在,这就是你想要为之收听/准备数据。

对于这类事情,我喜欢“函数式编程”,“地图函数”。我认为。我不能评论我的代表级别,或者我会限制我的猜测。 :)

要从另一个人获得更好的答案发布一些示例代码并尽可能地显示您的API。

0

为什么需要这不是在问题中指定,所以很难知道你需要什么,但我会给你一个总体思路和代码了。

你可以返回以这种方式:return var1, var2, var3(但是这不是你需要什么,我认为)

你有多种选择:要么阻塞或非阻塞。阻塞意味着您在调用函数时不再执行代码。非阻塞意味着它将并行运行。你也应该知道你一定需要修改调用该函数的代码。

,如果你想在一个线程(非阻塞)这就是:

def your_function(callback): 
    # This is a function defined inside of it, just for convenience, it can be any function. 
    def what_it_is_doing(callback): 
     import time 
     total = 0 
     while True: 
      time.sleep(1) 
      total += 1 
      # Here it is a callback function, but if you are using a 
      # GUI application (not only) for example (wx, Qt, GTK, ...) they usually have 
      # events/signals, you should be using this system. 
      callback(time_spent=total) 

    import thread 
    thread.start_new_thread(what_it_is_doing, tuple(callback)) 

# The way you would use it: 
def what_I_want_to_do_with_each_bit_of_result(time_spent): 
    print "Time is:", time_spent 

your_function(what_I_want_to_do_with_each_bit_of_result) 
# Continue your code normally 

其他选项(阻塞)涉及一种特殊的这些迭代器在技术上处理功能generators。所以你将它定义为一个函数并充当迭代器。这是一个例子,使用相同的虚拟功能,其中一个比另一个:

def my_generator(): 
    import time 
    total = 0 
    while True: 
     time.sleep(1) 
     total += 1 
     yield total 

# And here's how you use it: 
# You need it to be in a loop !! 
for time_spent in my_generator(): 
    print "Time spent is:", time_spent 

# Or, you could use it that way, and call .next() manually: 
my_gen = my_generator() 
# When you need something from it: 
time_spent = my_gen.next() 

注意,在第二个例子中,代码将毫无意义,因为它是不是真的叫每隔1秒,其原因在于其他代码每次运行yield或调用.next时,可能需要一些时间。但我希望你明白这一点。

同样,这取决于你在做什么,如果你使用的应用程序有一个“事件”框架或类似的你需要使用它,如果你需要它阻塞/非阻塞,如果时间很重要,你的调用代码如何操纵结果...

相关问题