threading.Timer()

时间:2013-05-16 03:44:48

标签: python python-2.7

我必须在网络课程中编写一个类似选择性重复但需要计时器的程序。在谷歌搜索后我发现threading.Timer可以帮助我,我写了一个简单的程序只是为了测试如何线程化.Timer工作是这样的:

import threading

def hello():
    print "hello, world"

t = threading.Timer(10.0, hello)
t.start() 
print "Hi"
i=10
i=i+20
print i

此程序正常运行。 但是当我尝试以一种给出如下参数的方式定义hello函数时:

import threading

def hello(s):
    print s

h="hello world"
t = threading.Timer(10.0, hello(h))
t.start() 
print "Hi"
i=10
i=i+20
print i

输出是:

hello world
Hi
30
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 726, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable

我无法理解这是什么问题! 任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:56)

您只需将hello的参数放入函数调用中的单独项目中,就像这样,

t = threading.Timer(10.0, hello, [h])

这是Python中的常用方法。否则,当您使用Timer(10.0, hello(h))时,此函数调用的结果将传递给TimerNone hello,因为{{1}}没有显式返回。

答案 1 :(得分:0)

如果要使用常规函数参数,则可以使用lambda。基本上,它告诉程序参数是函数,不要在赋值时调用。

t = threading.Timer(10.0, lambda: hello(h))