2012-11-18 30 views
4

我有一個多線程的SMTP服務器。每個線程照顧一個客戶端。我需要在每個服務器線程上設置10秒的超時值以終止休眠或行爲不當的客戶端。
我已經使用了time.time()來查找開始時間和我的檢查點時間,差異顯示了運行時間。但我相信它給系統時間,而不是這個線程運行的時間。
在Python中是否有線程本地計時器API?如何在Python中查找線程的運行時間

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

文檔說,你應該使用'time.clock'來計時而不是'time.time',但是也會給出處理器的時間,而不是線程的執行時間 –

回答

6

在Python文檔沒有 「時間線」 的提及。這兩個時鐘都是整個進程或系統範圍的。特別是time.clock可以測量處理時間,而time.time可以返回系統時間。

在python3.3中,時間API被修改和改進,但仍然沒有看到任何計時器會返回單個線程所花費的進程時間。

另請注意,即使可能,編寫這樣一個計時器也不是一件容易的事情。 定時器是特定於操作系統的,因此您必須爲每個操作系統編寫不同版本的模塊。如果你想分析一個特定的動作,只需啓動它而無需線程。 當它按預期運行時,或者由於操作系統而慢得多,在這種情況下,你不能做任何事情(至少,如果你不想寫一個修復程序的補丁「GIL或安全地移除它)。

2

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

添加以下內容:

def hello(): 
    global stop 
    stop = 1 
+0

感謝您的評論。這解決了第二個問題。但是,我仍然無法弄清楚如何在多線程程序中找到線程的運行時。這裏有什麼見解? – Venom

+0

這不回答問題。作爲對原始帖子的評論,它可能會更好。 – CivFan

-1

我發佈了一個示例代碼,它可以測量線程的運行時間,您可以修改代碼,以便與您的函數一起使用。

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秒的時間。

+0

只要您有多個線程同時運行,就不再準確。這是問題的關鍵。 換句話說,這並沒有回答這個問題。 – CivFan