我遇到了问题。 它是这样的, 函数通常返回单个结果。我想要的是在特定时间范围内返回连续的结果流(可选)。
函数重复返回单个函数调用的结果是否可行?
在浏览网络时,我确实遇到了gevent和线程。它是否会起作用如果有任何提示如何解决它?
我只需要调用函数执行工作并在每个任务完成后立即返回结果。
答案 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。