5

30秒ごとにコードを実行するために使用するコードブロックがあります

def hello():
    print "hello, world"
    t = threading.Timer(30.0, hello)
    t.start()

以下は、30秒ごとに実行したいクラスのメソッドですが、問題があります。

def continousUpdate(self, contractId):    
    print 'hello, world new'
    t = threading.Timer(30.0, self.continousUpdate, [self, contractId],{} )
    t.start()

実行すると、次のエラーが表示されます

pydev debugger: starting
hello, world new
Exception in thread Thread-4:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner
   self.run()
  File "C:\Python27\lib\threading.py", line 756, in run
   self.function(*self.args, **self.kwargs)
TypeError: continousUpdate() takes exactly 2 arguments (3 given)

私も試してみました

def continousUpdate(self, contractId):    
    print 'hello, world new'
    t = threading.Timer(30.0, self.continousUpdate(contractId))
    t.start()

どういうわけかスレッドを無視するかのように動作し、再帰制限エラーが発生します

4

2 に答える 2

17

これを試して:

t = threading.Timer(30.0, self.continousUpdate, [contractId],{} )

を読んだself.continuousUpdate時点で、まだ呼び出していなくても、メソッドは既にオブジェクトにバインドされています。再度渡す必要はありませんself

2番目のバージョンが「スレッドを無視する」理由は、呼び出しの引数内でメソッドをTimer呼び出すため、Timerが開始される前にメソッドが実行される(そしてそれ自体を再度呼び出そうとする)ためです。そのため、スレッド関数では、関数とその引数を別々に渡す必要があります (そのため、準備が整ったときに関数自体を呼び出すことができます)。

ところで、「連続」のスペルが間違っていました。

于 2012-08-06T05:24:16.963 に答える