代码之家  ›  专栏  ›  技术社区  ›  Rafael Saraiva

带回调的扭曲模拟计时器

  •  1
  • Rafael Saraiva  · 技术社区  · 11 年前

    我是扭曲的新手,我想模拟一个计时器或类似的东西。

    我拥有的是:

    def whatToCall():
        print 'Before: ' + str(len(globals.session_manager))
        for ses in globals.session_manager:
            if ses.expired is True:
                globals.session_manager[ses.id] = None
        print 'After: ' + str(len(globals.session_manager))
        reactor.callLater(15, whatToCall(), None)
    
    def callBacks():
        reactor.callLater(15, whatToCall(), None)
    ....
    #: Start the reactor
        reactor.callWhenRunning(callBacks())
        reactor.listenTCP(globals.port, factory)
        reactor.run()
    

    首先,我第一次打电话不需要15秒。其次,这显然行不通。我理解回调链和延迟的概念,但对此有一些困难。

    基本上,我想检查是否有任何会话不时过期,并希望每次都安排它。

    已解决:使用扭曲的任务:

    def checkForExpiredSessions():
       print 'Before: ' + str(len(globals.session_manager))
       for i, ses in enumerate(globals.session_manager):
          if ses.expired is True:
             del globals.session_manager[i]
       print 'After: ' + str(len(globals.session_manager))
    
    
    def callBacksRun():
      l = task.LoopingCall(checkForExpiredSessions)
      l.start(15.0)
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Jean-Paul Calderone    11 年前

    表达式:

    reactor.callWhenRunning(callBacks())
    

    第一 电话 callBacks 然后将返回值传递给 reactor.callWhenRunning 。类似的情况适用于:

    reactor.callLater(15, whatToCall(), None)
    

    reactor.call运行时 reactor.callLater 两者都接受可调用对象作为参数。除非你期望 回调 要返回一个将由reactor调用的可调用对象,您需要编写的内容是:

    reactor.callWhenRunning(callBacks)
    

    reactor.callLater(15, whatToCall)