Глобальные переменные Django с потоковой передачей

Я создаю веб-приложение для управления некоторым оборудованием, подключенным к Raspberry Pi.

Цель:

  1. On server startup do some tasks once and store information globally (open COM Ports and store as objects)
  2. 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
  3. Have possibility to terminate this thread anytime from a view and from within the thread
  4. 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 должны сбрасываться при перезагрузке сервера.

Возможно, мой дизайн несовершенен, и я открыт для любых предложений по достижению моей цели. Заранее большое спасибо!

Вернуться на верх