Глобальные переменные Django с потоковой передачей
Я создаю веб-приложение для управления некоторым оборудованием, подключенным к Raspberry Pi.
Цель:
- On server startup do some tasks once and store information globally (open COM Ports and store as objects)
- On POST/GET call from a view start a thread with the serialports from 1) plus some data (names as Strings) from the POST/GET call. This thread is some game logic for the hardware and runs for around one hour each
- Have possibility to terminate this thread anytime from a view and from within the thread
- Have possibility to get variables from thread and display on web-app
На данный момент я пытаюсь разобраться с общим дизайном этой задачи. Я новичок в потоковой обработке и Django и не могу связать их вместе. В моей реализации сейчас есть только простой бесконечный цикл, который должен выводить некоторую отладочную информацию, если глобальная переменная изменилась.
При запуске сервера я запускаю скрипт runner в новом потоке. Глобальная переменная хранится в cfg.py
и импортируется в apps.py
и views.py
. Все три файла находятся в корневом каталоге приложения.
cfg.py
RUNNING = False
views.py
from django.shortcuts import render
from .models import Player
from . import cfg
def index(request):
player = Player.objects.all()
if request.method == 'POST':
try:
print('got POST request')
cfg.RUNNING = True
except Exception as exc:
print(exc)
return render(request, 'mygame/index.html', {
'player' : player
})
apps.py
import os
import threading
import datetime
import time
from django.apps import AppConfig
from . import cfg
class MyGameConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'mygame'
def ready(self):
run_once = os.environ.get('CMDLINERUNNER_RUN_ONCE')
if run_once is not None:
return
os.environ['CMDLINERUNNER_RUN_ONCE'] = 'True'
#### Code to execute on startup
try:
bp_thread = threading.Thread(target=runner, args=('John', 'James', ), daemon=True)
bp_thread.start()
except Exception as exc:
raise exc
def runner(p1, p2, *args, **kwargs):
# dummy function running in background
starttime = datetime.datetime.now()
stroftime = starttime.isoformat()
print(f'process started at {stroftime}')
while True:
if cfg.RUNNING:
print('RUNNING = True')
print('setting back to False for testing')
cfg.RUNNING = False
else:
pass
time.sleep(1)
Почему моя функция def index(request)
не может изменить val переменной cfg.RUNNING
? Я получаю отладочную печать с got POST request, но функция runner не распознает измененное состояние cfg.RUNNING
.
Я также попробовал подход с global RUNNING
без успеха. Если бы мне нужно было передавать только строки, я бы использовал базу данных модели, но поскольку последовательные порты являются объектами, которые я не могу хранить в базе данных SQLite3, это, похоже, не подходит для моих нужд. Также vals должны сбрасываться при перезагрузке сервера.
Возможно, мой дизайн несовершенен, и я открыт для любых предложений по достижению моей цели. Заранее большое спасибо!