Порядок исполнения каналов Джанго - PullRequest
0 голосов
/ 09 октября 2018

Мне нужна помощь, чтобы понять, как Django Channels выполняет код.Вероятно, мне не хватает понимания sync vs async, поскольку он не выполняет то, что я ожидал.

В заключение я хотел, чтобы потребитель сделал следующее:

  1. Connect
  2. В сообщении от клиента
    • в цикле while:
      • выполнение длительной функции (1 секунда)
      • вызов group_send результаты широковещания

Это не сработало, поэтому я попытался создать очень простого потребителя, чтобы понять, что происходит.

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

Когда я запускаю метод приема, я вижу, что self.send происходит мгновенно, нои «2. Первый групповой вызов» и «3. Второй групповой вызов» происходят после длительной работы функции.Из временных отметок в console.log видно, что chat_message() выполняется только для "2. Первый групповой вызов" после длительной функции, даже если она появляется перед длительной функциейв методе receive.

Результаты в одной из консолей браузера:

  1. получены "1. Самостоятельная отправка 21: 45: 22.060500 "
  2. получено "2. 21: 45: 22.060500 начало первого группового чата: 21: 45: 24.529500"
  3. получено "3. 21: 45:22.060500 отправка второй группы lrf start_time: 21: 45: 22.348000 lrf end_time: 21: 45: 24.349500 начало чата: 21: 45: 24.537000 "

Отметки времени, выделенные полужирным шрифтом, являются отметкой времени, когдаМетод получения был запущен. "начало чата" отметка времени - это когда вызывается метод chat_message.

class MyConsumer(WebsocketConsumer):
    groups = ["my_group"]

    def connect(self):
        print("connected")
        self.accept()

    def receive(self, text_data=None, bytes_data=None):
        ts = datetime.now().strftime("%H:%M:%S.%f")

        self.send(text_data=json.dumps("1. Self send {}".format(ts)))

        text_data = "2. {} first group call".format(ts)
        async_to_sync(self.channel_layer.group_send)(
            "my_group",
            {
                "type": "chat.message",
                "text": text_data,
            },
        )
        text_data = self.long_running_function(ts)
        async_to_sync(self.channel_layer.group_send)(
            "my_group",
            {
                "type": "chat.message",
                "text": text_data,
            },
        )

    def disconnect(self, close_code):
        print("disconnected")
        async_to_sync(self.channel_layer.group_discard)("my_group", self.channel_name)

    def chat_message(self, event):
        chat_msg_start_time = datetime.now().strftime("%H:%M:%S.%f")
        text_data = "{} chat start: {}".format(event["text"], chat_msg_start_time)
        self.send(text_data=json.dumps(text_data))

    def long_running_function(self, ts):
        start_time = datetime.now().strftime("%H:%M:%S.%f")
        time.sleep(2)
        end_time = datetime.now().strftime("%H:%M:%S.%f")
        msg = "3. {} second group send lrf start_time: {} lrf end_time: {}".format(ts, start_time, end_time)
        return msg
...