Переменная класса Python не имеет значения, несмотря на то, что она установлена

У меня возникают трудности с взаимодействием потоков в Python. Я явно что-то упускаю, но я новичок в Python, поэтому не очень хорошо понимаю, что я делаю.

Когда сервер получает GET-запрос, я хочу, чтобы он получил два числа (координаты x и y) из отдельного потока, который постоянно обновляет эти значения, и вернул эти числа в качестве ответа.

У меня есть простой проект Django со следующей структурой:

enter image description here

он очень простой, сделан в соответствии с учебником.

Когда сервер запускается, я начинаю поток, который запускает мой генератор координат в отдельном потоке:

class GpsMockCoordsServiceConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'gps_mock_coords_service'

    def ready(self):
        if os.environ.get('RUN_MAIN', None) != 'true':
            _thread.start_new_thread(CoordsTracker.launch_recognition, ())

Класс CoordsTracker выглядит следующим образом:

coords = None
class CoordsTracker:
    #coords = None #tried placin it here, but same effect - it is None when retreived from views.py

    logger = logging.getLogger("CoordsTrackerLogger")

    @staticmethod
    def draw_contours(mask, frame, color):
            ......
        for stuff in stuffs:
                 ......
            CoordsTracker.set_coords((x, y))
                 ......

    @staticmethod
        def launch_recognition():
                ........
           while True:
                    ........
               CoordsTracker.draw_contours(....)
                    ........

   @staticmethod
   def set_coords(new_coords):
       global coords
       CoordsTracker.logger.debug("setting coords " + str(new_coords))
       coords = new_coords # here coords var is OK

   @staticmethod
   def get_coords():
       CoordsTracker.logger.debug(coords) # Here it is OK if I call this method from draw_contours() and is not OK if I call this from views.py file.
       return coords

классviews.py имеет только этот метод:

def index(request):
    # with CoordsTracker.coords_thread_lock:
    coords = CoordsTracker.get_coords()
    logger.debug("Got coords: " + str(coords)) #if I do a GET request this prints 'Got coords: None'
    return HttpResponse(str(coords))

Я бы рекомендовал реализовать какой-нибудь IPC с имеющимся у вас промежуточным ПО. Но если это разовый проект, вы можете просто запустить поток (launch_recognition) из wsgi.py. Это обеспечит выполнение всего в одном процессе.

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