Python线程.Timer对象在多小时计时器后不会触发

时间:2014-01-14 17:11:49

标签: python multithreading timer bots irc

我正在编写一个小型IRC bot,它使用从JSON API中获取的数据。这是一个事件列表,其中包含任何正在运行的事件,然后是任何未来事件。

我想在每次活动前两次提醒频道:提前一小时,提前五分钟。为此,我试图创建在适当的时间触发的threading.Timer事件。我之所以选择这种方法是因为IRC僵尸程序需要在无限循环中运行,因此警报需要在自己的线程中运行。我已多次进行第一次警报工作,但只有在机器人启动后约5分钟内触发。如果我开始说,在下一个事件发生前8小时,它根本不会触发该方法。这是警报代码:我已经删除了从API解析时间的代码部分,因为它已经起作用并且对于这个问题而言只是混乱。

USE = pytz.timezone('US/Eastern')
ZULU=pytz.timezone('Zulu')
NET = 0
r = requests.get('http://api.pathofexile.com/leagues?type=event')
events=r.json()
NextEvent=events[0];
now = datetime.datetime.now(USE)
nextEventTime = events[0]['startAt']
/\/\
timeConverted=datetime.datetime(eventTimeY, eventTimeM, eventTimeD, eventTimeH, eventTimeMin, 0, 0).replace(tzinfo=ZULU)
until = timeConverted - now
NET = until.total_seconds()

#Race Alerts

def hourAlert():
   r = requests.get('http://api.pathofexile.com/leagues?type=event')
   events=r.json()
   NextEvent=events[0];
   now = datetime.datetime.now(USE)
   nextEventTime = events[0]['startAt']
   \/\/
   timeConverted=datetime.datetime(eventTimeY, eventTimeM, eventTimeD, eventTimeH, eventTimeMin, 0, 0).replace(tzinfo=ZULU)   
   until = timeConverted - now
   NET = until.total_seconds()
   print("HOURALERT")
   if until.total_seconds() > 0:
    irc.send(bytes('PRIVMSG '+channel+' '+"EVENT ALERT - 1 HOUR - "+NextEvent['id'] +' - Occurs at '+NextEvent['startAt']+' - '+NextEvent['url']+'\r\n', 'UTF-8')) #gives event info
    print("Starting Timer to event - "+str(NET-300))
    sAlert = threading.Timer(NET-300, startAlert)
    sAlert.start()
   else:
    NextEvent=events[1];
    now = datetime.datetime.now(USE)
    nextEventTime = events[1]['startAt']
    \/\/
    timeConverted=datetime.datetime(eventTimeY, eventTimeM, eventTimeD, eventTimeH, eventTimeMin, 0, 0).replace(tzinfo=ZULU)    
    until = timeConverted - now
    NET = until.total_seconds()
    irc.send(bytes('PRIVMSG '+channel+' '+"EVENT ALERT - 1 HOUR - "+NextEvent['id'] +' - Occurs at '+NextEvent['startAt']+' - '+NextEvent['url']+'\r\n', 'UTF-8')) #gives event info
    print("Starting Timer to next event - "+str(NET-300))
    sAlert = threading.Timer(NET-300, startAlert)
    sAlert.start()  
def startAlert():
   r = requests.get('http://api.pathofexile.com/leagues?type=event')
   events=r.json()
   NextEvent=events[0];
   now = datetime.datetime.now(USE)
   nextEventTime = events[1]['startAt']
   \/\/
   timeConverted=datetime.datetime(eventTimeY, eventTimeM, eventTimeD, eventTimeH, eventTimeMin, 0, 0).replace(tzinfo=ZULU)
   until = timeConverted - now
   NET = until.total_seconds()
   print("STARTALERT")
   irc.send(bytes('PRIVMSG '+channel+' '+"EVENT ALERT - STARTING IN 5 MINUTES - "+NextEvent['id'] +' - '+NextEvent['url']+'\r\n', 'UTF-8')) #gives event info
   NextEvent=events[1];
   if until.total_seconds() > 3600:
    print("Starting Timer to 1hr - " + str(NET-3600))
    hAlert = threading.Timer(NET-3600, hourAlert)
    hAlert.start()
   else:
    print("Starting Timer to event - " +str(NET-300))
    sAlert = threading.Timer(NET-300, startAlert)
    sAlert.start()
if until.total_seconds() > 3600:
  print("Starting Timer to 1hr - " + str(NET-3600))
  hAlert = threading.Timer(NET-3600, hourAlert)
  hAlert.start()
elif until.total_seconds() > 300:
  print("Starting Timer to event - " + str(NET-300))
  hAlert = threading.Timer(NET-300, startAlert)
  hAlert.start() 
else:
  NextEvent=events[1];
  now = datetime.datetime.now(USE)
  nextEventTime = events[1]['startAt']
  \/\/
  timeConverted=datetime.datetime(eventTimeY, eventTimeM, eventTimeD, eventTimeH, eventTimeMin, 0, 0).replace(tzinfo=ZULU)
  until = timeConverted - now
  NET = until.total_seconds()
  print("Starting Timer to next event 1h - "+str(NET-3600))
  hAlert = threading.Timer(NET-3600, hourAlert)
  hAlert.start()
#End Alerts

我怀疑我的问题是使用timedelta.seconds值而不是total_seconds(),但我不知道它是否可以工作几个小时。我在这里问的主要原因是因为这段代码在测试平台中工作:如果我告诉它下一个事件是在30秒内,并在事件发生之前触发15和5,它就可以正常工作。但是,当我将代码带回到多小时的时间跨度时,事件通常不会触发。他们没有错误,他们只是直接不工作:甚至没有警报打印发生。

感谢你们的帮助!

编辑:我应该提一下,这是我编写的第一个python程序,但我是一个相当有经验的编码器。我的问题可能与语言有关,因为我正在用python不想要的方式做某事。我不确定,例如,如果这样的嵌套事件会导致它们永远不会触发,因为每个事件都会在触发它自己之前等待子函数的完全解析。

edit2:经过更多工作后,我可以获得第一个警报,但是尽管根据print语句创建了下一个Timer,但它永远不会触发。嵌套触发器的东西是错误的吗?

0 个答案:

没有答案