2015-01-29 5 views
1

Я новичок в скручивании, и мне захотелось имитировать таймер или что-то в этом роде.Скрученный имитирующий таймер с обратным вызовом

Что я имею:

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

Выражение:

reactor.callWhenRunning(callBacks()) 

Первые звонкиcallBacks, а затем передает возвращаемое значение reactor.callWhenRunning. Нечто подобное верно и для:

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

reactor.callWhenRunning и reactor.callLater оба принимают вызываемые объекты в качестве аргумента. Если вы не ожидаете callBacks вернуть вызываемый объект, который собирается назвать реактором, что вы хотите написать, чтобы достичь желаемого эффекта:

reactor.callWhenRunning(callBacks) 

и

reactor.callLater(15, whatToCall) 
Смежные вопросы