7

我有一个多线程 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 循环。

4

5 回答 5

8

自从提出这个问题以来,Python 在 6 年里取得了进步,在 3.3 版中,它引入了一个工具,可以准确地解决这里所要求的内容:

time.clock_gettime(time.CLOCK_THREAD_CPUTIME_ID)

Python 3.7 还引入了一个类似的time.clock_gettime_ns.

详细的文档正是您所期望的,但该功能开箱即用非常简单。

于 2018-10-03T10:28:14.967 回答
7

在 python 文档中没有提到“线程计时”。时钟要么是进程范围的,要么是系统范围的。特别是在返回系统时间的time.clock同时测量处理时间。time.time

在 python3.3 中,计时 API 得到了修改和改进,但我仍然看不到任何计时器可以返回单个线程所用的进程时间。

另请注意,即使可能,编写这样的计时器也并非易事。计时器是特定于操作系统的,因此您必须为每个操作系统编写不同版本的模块。如果您想分析特定操作,只需在没有线程的情况下启动它。当线程化时序时,它要么按预期运行,要么由于操作系统而慢得多,在这种情况下,您无能为力(至少,如果您不想编写“修复”的补丁) GIL 或安全地移除它)。

于 2012-11-18T19:53:22.157 回答
6

Python 3.7 添加了time.thread_time()似乎可以满足此问题所需的方法。根据文档,它是特定于线程的,不包括睡眠时间。

于 2019-07-25T14:04:24.393 回答
2

hello 函数的停止值是本地的,而不是全局的。

添加以下内容:

def hello():
   global stop
   stop = 1
于 2012-11-18T18:44:26.890 回答
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 秒的时间。

于 2013-10-02T14:32:58.883 回答