为什么我应该使用threading.Timer而不是Loop + Sleep?

时间:2014-03-28 09:00:46

标签: python multithreading timer

我是Python的新手,似乎我必须编写一个能够并行工作的脚本。好吧,我决定尝试构建一个多线程脚本,我觉得它实际工作正常。在做研究的过程中,我发现了许多例子,但只有少数例子适合我。最后我读了this question (Stackoverflow questions/474528 - second Answer - fifths comment)

  

shed模块的文档也指向threading.Timer类,它更适合多线程环境。

对我而言,这听起来像是线程。在这种情况下,对我来说,定时器是更好的功能。然后我想知道为什么......也许在我继续之前,在上面的同一个链接上,对第二个答案的第一个评论,有人在问

  

sched模块用于调度函数在一段时间后运行,如何在不使用time.sleep()的情况下每隔x秒重复一次函数调用?

现在我在考虑,如果我必须循环和睡眠,功能如何更好或不好。我的意思是Timer的第一个参数只表示他应该等多久才能开始。我试了一下解决方法:

#! C:\Python34\env python.exe
# -*- coding: utf-8 -*-

import threading
import time

class c_Thread ( threading.Thread ):
    sThreadName = ''
    iThreadInterval = 0

    def __init__ ( self, sThreadName, iThreadInterval ):
        threading.Thread.__init__ ( self )
        self.sThreadName = sThreadName
        self.iThreadInterval = iThreadInterval
        print ( )

    def run ( self ):
        print ( "Starting " + self.sThreadName )
        print_time ( self.sThreadName, self.iThreadInterval )
        print ( "Exiting " + self.sThreadName )
        print ( )

def print_time( sThreadName, iThreadInterval):
    while True:
        time.sleep(iThreadInterval)
        print ( sThreadName + ": " + time.ctime ( time.time ( ) ) )

Thread1 = c_Thread ( "ThreadOne", 2 )
Thread2 = c_Thread ( "ThreadTwo", 5 )

Thread1.start ( )
Thread2.start ( )

print ("Exiting Main Thread")

这个脚本工作正常。现在我想好了,但是为什么我应该使用睡眠,如果Timer函数无论如何都具有相同的功能。所以我试过了:

#! C:\Python34\env python.exe
# -*- coding: utf-8 -*-

import threading
import time

class c_Thread ( threading.Thread ):
    sThreadName = ''
    iThreadInterval = 0

    def __init__ ( self, sThreadName, iThreadInterval ):
        threading.Thread.__init__ ( self )
        self.sThreadName = sThreadName
        self.iThreadInterval = iThreadInterval

    def run ( self ):
        print ( "Register Timer-Thread: " + self.sThreadName )
        while True:
            hTimer = threading.Timer ( self.iThreadInterval, print_time, ( self.sThreadName ) )
            hTimer . start ( )

def print_time( sThreadName ):
    print ( sThreadName + ": " + time.ctime ( time.time ( ) ) )

Thread1 = c_Thread ( "One", 2 )
Thread2 = c_Thread ( "Two", 5 )

Thread1 . start ( )
Thread2 . start ( )

但实际上我没有让这个运行正确...我收到了这个错误:

  

TypeError:print_time()需要1个位置参数,但有3个被赋予

我做了一些研究,我发现'self'是第一个对象,所以我在print_time上的参数上添加了self。

def print_time( self, sThreadName ):

一开始我只将'sTreadI'作为参数。所以第二个是“sTread”,但是第三个来自哪里呢?

我做了调试打印,添加了第三个参数但不使用它。

def print_time( self, sThreadName, idk ):
    #print ( "self: " + self )
    #print ( "sThreadName: " + sThreadName )
    #print ( "idk: " + idk)
    #print ( )
    print ( sThreadName + ": " + time.ctime ( time.time ( ) ) )

但是'sTreadID'不正确,它总是像单个字母(例如'n')......也许在这一点上有人可以帮助我吗?

除了'sTreadI'错误之外,如果我在我的函数上使用了3个参数而忽略了第三个参数(没有用),我的脚本没有做我期望的事情。我期待与上面发布的第一个脚本完全相同的行为。为什么不是这种情况。我真的想要解决这个问题。

到目前为止,感谢所有想要帮助我的人的建议。 此致,迈克。

环境: Windows 7专业版64位 Python 3.4 代码编辑器:Notepad ++ 通过'python -tt script.py'

在CMD上运行

1 个答案:

答案 0 :(得分:0)

改变这个:

def run ( self ):
    print ( "Register Timer-Thread: " + self.sThreadName )
    while True:
        hTimer = threading.Timer ( self.iThreadInterval, print_time, ( self.sThreadName ) )
        hTimer . start ( )

太:

def run ( self ):
    print ( "Register Timer-Thread: " + self.sThreadName )
    while True:
        hTimer = threading.Timer ( self.iThreadInterval, print_time( self.sThreadName ) )
        hTimer . start ( )

所以只是:“print_time,(self.sThreadName)”应该没有逗号“print_time(self.sThreadName)”