我想运行一个10秒的函数,然后做其他的事情。这是我使用Timer
的代码from threading import Timer
import time
def timeout():
b='true'
return b
a='false'
t = Timer(10,timeout)
t.start()
while(a=='false'):
print '1'
time.sleep(1)
print '2'
我知道使用Timer I可以在计时器的末尾打印一些东西(打印b而不是返回b在10秒后返回true)。 我想知道的是:我可以在“a”中获取timeout()返回的值,以正确执行我的while循环吗?
或者是否有其他方法可以使用其他功能?
答案 0 :(得分:2)
我们可以在source中看到该函数的返回值仅被Timer
删除。解决这个问题的方法是传递一个可变参数并在函数内部进行变异:
def work(container):
container[0] = True
a = [False]
t = Timer(10, work, args=(a,))
t.start()
while not a[0]:
print "Waiting, a[0]={0}...".format(a[0])
time.sleep(1)
print "Done, result: {0}.".format(a[0])
或者,使用global
,但这不是绅士的方式。
答案 1 :(得分:2)
Timer对象在单独的线程中等待并执行回调函数。如果要返回值,则需要设置某种线程间通信。最简单的方法是设置一个全局变量并通过回调函数对其进行修改:
from threading import Timer
import time
return_val = None
def timeout():
global return_val
return_val = True
return
a = False
t = Timer(10,timeout)
t.start()
count = 0
while not a:
print count
time.sleep(1)
if return_val:
break
count += 1
print 'done'
输出:
0
1
2
3
4
5
6
7
8
9
完成
我知道全局变形通常是不受欢迎的,但如果仔细使用它们就可以了。我在这里的用法严格限制在我建立只需要一个线程修改共享内存的情况下,精度并不重要。