Django-Channels: блокировка критической секции в классе - PullRequest
1 голос
/ 25 апреля 2019

У меня есть класс, который расширяет WebsocketConsumer и таким образом связывается с клиентом через веб-сокет. Насколько я понимаю, весь процесс управляется событиями, и у меня есть один метод, имеющий критическую секцию (я не хочу, чтобы функция снова запускалась, пока она еще обрабатывается).

Могу ли я просто использовать встроенный модуль Python threading для блокировки этого раздела. Например:

import threading
class UserCharacterConsumer(WebsocketConsumer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, *kwargs)
        self.lock = threading.Lock()

    def critical_method(self):
        self.lock.acquire()

        try:
            # critical section
            pass
        finally:
            self.lock.release()

Или это не сработает для Django-Channels, потому что он не использует потоки таким образом?

Редактировать: достаточно заблокировать метод только для текущего пользователя (или даже только для экземпляра класса)

1 Ответ

1 голос
/ 25 апреля 2019

Это может сработать в процессе разработки, но оно будет работать в производственном процессе, потому что обычно у вас есть несколько процессов и, возможно, даже несколько машин (или виртуальных машин / контейнеров).

Вам необходимо использовать некоторое общее внешнее хранилище данных.Для этого вы могли бы использовать свою базу данных, но что-то вроде Redis было бы предпочтительным (например, используя Redlock ).

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

...