2017-01-02 2 views
1

Я запускаю таймер Python в представлении Django, и я использую другое представление Django, чтобы отменить его. Тем не менее, я обнаружил, что я не могу получить доступ к объекту Timer последовательно, когда я пытаюсь его отменить.Объект таймера непоследовательно доступен

Код в моем «views.py» выглядит следующим образом:

import threading 

myTimer = None 

def f(): 
    pass 

def startTimer(request): 
    global myTimer 

    myTimer = threading.Timer(10000, f) 
    myTimer.start() 
    pass 

def stopTimer(request): 
    if myTimer != None: 
     myTimer.cancel() 
    else: 
     print("No timer found.") 
    pass 

Когда я пытаюсь отменить таймер, много раз, я не получаю «Нет таймера не найдено.» сообщение. После некоторых попыток, казалось бы, случайным образом, объект Timer найден, и отмена удалась. Это явление происходит только тогда, когда я запускаю код на сервере. Когда код запускается на моем локальном компьютере, эта проблема никогда не возникает.

+1

Что вы используете в качестве своего серверного программного обеспечения? Он настроен на запуск как один процесс или несколько процессов? Я подозреваю, что у вас несколько процессов на вашем сервере, поэтому объект Timer существует в одном процессе, но не существует в другом. –

ответ

0

Вы никогда не должны использовать глобальные объекты, подобные этому, в серверной среде. У вашего сервера почти наверняка есть несколько процессов, каждый из которых имеет свои собственные локальные пространства имен, поэтому таймер не будет использоваться между ними.

Вторая причина заключается в том, что у вас, вероятно, будет несколько пользователей для вашего сайта; все они будут иметь доступ к тем же глобальным переменным в каждом процессе.

Я не совсем уверен, что вы здесь делаете, но одним из способов сделать таймер для каждого пользователя было бы использовать session для хранения текущего времени, когда пользователь нажимает на запуск, а затем вычисляет разницу между это время, когда они нажимают конец.

Смежные вопросы