-1

我在 python 2.74 上使用 threading.Timer。这是相关的代码:

__lock = threading.Lock()
def RegeneratePopulationData():
    __lock.acquire()
    print 'I feel regenerated!'
    __lock.release()

def __setRegenerationTimer(firstTime = False):
    global __regenerationTimer
    now = _getNow().date()
    nextRun = datetime(now.year, now.month, now.day + 1, 2, 0)
    __regenerationTimer = threading.Timer((nextRun - _getNow()).total_seconds(), __setRegenerationTimer)
    print 'Regeneration timer set to run in %s' % (nextRun - _getNow())
    print __regenerationTimer.interval
    __regenerationTimer.start()
    if not firstTime:
        RegeneratePopulationData()

def _getNow():
        return datetime.now() + timedelta(hours = TIME_DIF)

这会导致从 threading.py 抛出 TypeError 异常。我已经在网上搜索了几个小时,但找不到解决方案。

将 threading.py 中的代码(出于调试目的)更改为第 349 行附近的代码后:

            # than 20 times per second (or the timeout time remaining).
            print _time()
            print timeout
            endtime = _time() + timeout
            delay = 0.0005 # 500 us -> initial delay of 1 ms

这是我得到的例外:

Regeneration timer set to run in 2:52:12.337000
10332.337
1377634067.66
10332.337
1377634067.66
2013-08-27 21:07:47.663000
Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 812, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 1082, in run
    self.finished.wait(self.interval)
  File "C:\Python27\lib\threading.py", line 622, in wait
    self.__cond.wait(timeout)
  File "C:\Python27\lib\threading.py", line 350, in wait
    endtime = _time() + timeout
TypeError: unsupported operand type(s) for +: 'float' and 'datetime.datetime'

我不明白为什么间隔突然变成日期时间!

有人可以帮忙吗?

4

1 回答 1

2

您的代码没有显示timeout来自哪里。它不是“突然变成”任何东西。无论您的代码是什么,在以前的某个时间点,adatetime.datetime都被分配给timeout. 要么消除这种情况,要么适当地处理它(也许通过捕获异常)。

更新:您正在修改标准库代码,这是一个糟糕的主意。直接或间接地,你传递了一个datetime.datetime. pdb用来弄清楚在哪里。在 python 控制台中运行您的代码。当您触发异常时import pdb; pdb.pm(),您将进入异常位置的调试器。你可以从那里探索。

于 2013-08-27T20:28:42.110 回答