0

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

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

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

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

4

2 回答 2

2

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

您可以以这种方式返回:(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调用它时都会运行其他代码,这可能需要一些时间。但我希望你明白这一点。

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

于 2012-05-25T07:11:21.183 回答
0

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

因此,封装函数的调用代码很重要,函数、任何函数,例如,即使是真/假布尔函数也只会执行直到它的变量完成,所以在你的情况下必须有一个无限期监听的调用函数. 如果它不存在,你应该写一个;)

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

人们不会有足够的信息来提供太多帮助,除非在超级一般意义上,我们可以告诉你你现在或应该在某个框架的事件循环中,或者已经在某种形式的其他代码循环中——这就是你想听/准备数据。

对于这类事情,我喜欢“函数式编程”、“映射函数”。我认为。我不能在我的代表级别发表评论,否则我会限制我的猜测。:)

为了从其他人那里获得更好的答案,请发布一些示例代码并尽可能展示您的 API。

于 2012-05-25T06:12:57.683 回答