我有一个多线程SMTP服务器。每个线程负责一个客户端。我需要在每个服务器线程上设置10秒的超时值,以终止休眠或行为不端的客户端
我使用time.time()
来查找开始时间和检查点时间,差异给出了运行时间。但我相信它给了系统时间而不是这个线程运行的时间
Python中是否有Thread本地计时器API?
import threading
stop = 0
def hello():
stop = 1
t=threading.Timer(10,hello)
t.start()
while stop != 1:
print stop
print "stop changed"
这会在循环中打印0(初始停止)并且不会出现在while循环中。
答案 0 :(得分:8)
在python文档中没有提到“线程计时”。时钟在整个过程中或系统范围内。特别是time.clock
测量处理时间,time.time
返回系统时间。
在python3.3中,时序API经过修订和改进但仍然没有看到任何计时器会返回单个线程所需的处理时间。
另请注意,即使可能,编写此类计时器也不容易。 定时器是特定于操作系统的,因此您必须为每个操作系统编写不同版本的模块。如果要分析特定操作,只需在没有线程的情况下启动它。 当线程时,它按预期运行,或者由于操作系统而慢很多,在这种情况下你不能对它做任何事情(至少,如果你不想写一个“修复”的补丁) GIL或安全删除它。
答案 1 :(得分:2)
hello函数的停止值是本地的,而不是全局的。
添加以下内容:
def hello():
global stop
stop = 1
答案 2 :(得分:2)
自从提出此问题以来,Python已经发展了6年,而在3.3版中,它引入了一种工具,可以准确地满足以下要求:
time.clock_gettime(time.CLOCK_THREAD_CPUTIME_ID)
Python 3.7还引入了类似的time.clock_gettime_ns
。
详细的文档为exactly where you'd expect,但该功能非常简单易用。
答案 3 :(得分:0)
我发布了一个可以测量线程运行时间的示例代码,您可以修改代码,以便与您的函数一起使用。
import time
import threading
def hello():
x = 0
while x < 100000000:
pass
x += 1
start = time.clock()
t = threading.Thread(target = hello, args = ())
t.start()
t.join()
end = time.clock()
print "The time was {}".format(end - start)
在我的系统上,它给出了8.34秒的时间。
答案 4 :(得分:0)
Python 3.7添加了time.thread_time()
方法,该方法似乎可以解决此问题。根据{{3}},它是特定于线程的,不包括睡眠时间。