我遇到了一个问题。就像这样,一个函数通常返回一个结果。我想要的是在某个时间范围内返回连续的结果流(可选)。
函数重复返回单个函数调用的结果是否可行?
在浏览网络时,我确实遇到了 gevent 和 threading。如果有任何提示如何解决它,它会起作用吗?
我只需要在每个任务完成后立即调用该函数执行工作并返回结果。
我遇到了一个问题。就像这样,一个函数通常返回一个结果。我想要的是在某个时间范围内返回连续的结果流(可选)。
函数重复返回单个函数调用的结果是否可行?
在浏览网络时,我确实遇到了 gevent 和 threading。如果有任何提示如何解决它,它会起作用吗?
我只需要在每个任务完成后立即调用该函数执行工作并返回结果。
为什么你需要这个问题没有在问题中指定,所以很难知道你需要什么,但我会给你一个大概的想法,还有代码。
您可以以这种方式返回:(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
调用它时都会运行其他代码,这可能需要一些时间。但我希望你明白这一点。
同样,这取决于你在做什么,如果你使用的应用程序有一个“事件”框架或类似的框架,你需要使用它,如果你需要它阻塞/非阻塞,如果时间很重要,你的调用代码如何应该操纵结果...
您的 gevent 和线程在正确的轨道上,因为一个函数执行它被编程做的事情,要么一次接受 1 个 var,要么接受一个集合并返回一个集合或一个 var。必须调用该函数以返回任一结果,并且连续的处理流可能已经发生,否则您正在询问内核指针或类似内容的循环,而您不是,所以...
因此,封装函数的调用代码很重要,函数、任何函数,例如,即使是真/假布尔函数也只会执行直到它的变量完成,所以在你的情况下必须有一个无限期监听的调用函数. 如果它不存在,你应该写一个;)
调用封装的代码当然很重要。
人们不会有足够的信息来提供太多帮助,除非在超级一般意义上,我们可以告诉你你现在或应该在某个框架的事件循环中,或者已经在某种形式的其他代码循环中——这就是你想听/准备数据。
对于这类事情,我喜欢“函数式编程”、“映射函数”。我认为。我不能在我的代表级别发表评论,否则我会限制我的猜测。:)
为了从其他人那里获得更好的答案,请发布一些示例代码并尽可能展示您的 API。