Мне нужна помощь, чтобы понять, как Django Channels выполняет код.Вероятно, мне не хватает понимания sync vs async, поскольку он не выполняет то, что я ожидал.
В заключение я хотел, чтобы потребитель сделал следующее:
- Connect
- В сообщении от клиента
- в цикле while:
- выполнение длительной функции (1 секунда)
- вызов
group_send
результаты широковещания
Это не сработало, поэтому я попытался создать очень простого потребителя, чтобы понять, что происходит.
Я создаю WebsocketConsumer
какЯ думаю, что я хочу, чтобы он выполнялся syncronously
, т.е. я хочу, чтобы каждый цикл выполнялся, а затем транслировал результаты, а затем выполнялся снова.
Когда я запускаю метод приема, я вижу, что self.send
происходит мгновенно, нои «2. Первый групповой вызов» и «3. Второй групповой вызов» происходят после длительной работы функции.Из временных отметок в console.log
видно, что chat_message()
выполняется только для "2. Первый групповой вызов" после длительной функции, даже если она появляется перед длительной функциейв методе receive
.
Результаты в одной из консолей браузера:
- получены "1. Самостоятельная отправка 21: 45: 22.060500 "
- получено "2. 21: 45: 22.060500 начало первого группового чата: 21: 45: 24.529500"
- получено "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