我需要一些帮助来了解Django Channels如何执行代码。我可能缺少对同步与异步的一些了解,因为它没有达到我的期望。
总而言之,我想要一个可以执行以下操作的消费者:
group_send
广播结果这没有用,所以我试图创建一个非常简单的使用者以了解发生了什么。
我创建了一个WebsocketConsumer
,因为我想让它运行syncronously
,即我希望每个循环都执行然后广播结果,然后再次执行。
当我触发接收方法时,我看到self.send
立即发生,但是“ 2。第一个群组呼叫” 和“ 3。第二个群组呼叫” < / em>在长时间运行的函数之后发生。从console.log
的时间戳中可以看到,chat_message()
仅在长时间运行的功能之后针对“ 2。首次群组呼叫” 执行。在receive
方法中长期运行的功能之前。
其中一个浏览器控制台的结果为:
以粗体显示的时间戳是开始接收方法的时间戳。 “聊天开始” 时间戳记是当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