почему используется функция syn c get_channel_layer().send()
, сообщение отправляется в конце обработки
def external_send(channel_name, data):
channel_layer = get_channel_layer()
send_sync = async_to_sync(channel_layer.send)
send_sync(
channel_name,
{
"type": "send_json",
"message": {"datetime": datetime.datetime.now().isoformat(), **data},
},
)
с использованием self.send()
в работе потребителя, как ожидалось
вот мой потребитель класс для тестирования:
class TestConsumer(JsonWebsocketConsumer):
def connect(self):
self.accept()
def disconnect(self, close_code):
pass
def receive_json(self, content, **kwargs):
logger.debug(f"RECEIVE {content}")
self.send_json(
{
"id": 1,
"text": "Before sleep: self.send_json",
"datetime": datetime.datetime.now().isoformat(),
}
)
external_send(
self.channel_name, {"id": 2, "text": "Before sleep external_send"}
)
sleep(10) # Simuleting long processing
self.send_json(
{
"id": 3,
"text": "After sleep: self.send_json",
"datetime": datetime.datetime.now().isoformat(),
}
)
super().receive_json(content, **kwargs)
logger.debug("END")
Во внешнем интерфейсе я получаю заказ
- {id: 1, текст: «Перед сном: self.send_ json», datetime : "2020-05-29T14: 30: 58.226545"}
- {id: 3, текст: "После сна: self.send_ json", datetime: "2020-05-29T14: 31: 03.244865 "}
- {id: 2, text:" Перед сном external_send ", datetime:" 2020-05-29T14: 30: 58.230164 "}