从单个函数调用返回连续结果

时间:2012-05-25 06:01:06

标签: python events data-structures asynchronous

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

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

在浏览网络时,我确实遇到了gevent和线程。它是否会起作用如果有任何提示如何解决它?

我只需要调用函数执行工作并在每个任务完成后立即返回结果。

2 个答案:

答案 0 :(得分:1)

为什么你需要这个没有在问题中指定,所以很难知道你需要什么,但我会给你一个大致的想法,也是代码。

你可以这样回来: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被叫,这可能需要时间。但我希望你明白这一点。

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

答案 1 :(得分:0)

你的gevent和线程在正确的轨道上,因为一个函数执行它编程要做的事情,要么一次接受1个var,要么取一个set并返回一个set或var。必须调用该函数才能返回结果,并且连续的处理流可能已经发生,否则你会询问有关内核指针或类似事件的循环,你不是这样,所以......

所以,你的调用代码来封装你的函数很重要,函数,任何函数,例如,甚至真/假布尔函数只有在完成它的变量之后才会执行,所以有冥想是一个在你的情况下无限期倾听的调用函数。如果它不存在,你应该写一个;)

调用封装的代码当然非常重要。

人们不会有足够的信息来帮助太多,除了超级通用的意义,我们可以告诉你,你是或应该在某个框架的事件循环中,或已经某种形式的其他代码循环 - 和这就是你想要收听/准备数据的内容。

我喜欢“函数式编程”,“地图函数”这类东西。我认为。我不能在我的代表级别发表评论,否则我会限制我的推测。 :)

要从其他人那里获得更好的答案,请发布一些示例代码,并在可能的情况下透露您的API。