Django频道执行顺序

时间:2018-10-08 21:32:21

标签: python django websocket django-channels

我需要一些帮助来了解Django Channels如何执行代码。我可能缺少对同步与异步的一些了解,因为它没有达到我的期望。

总而言之,我想要一个可以执行以下操作的消费者:

  1. 连接
  2. 来自客户端的消息
    • 在while循环中:
      • 执行长时间运行的功能(1秒)
      • 呼叫group_send广播结果

这没有用,所以我试图创建一个非常简单的使用者以了解发生了什么。

我创建了一个WebsocketConsumer,因为我想让它运行syncronously,即我希望每个循环都执行然后广播结果,然后再次执行。

当我触发接收方法时,我看到self.send立即发生,但是“ 2。第一个群组呼叫” “ 3。第二个群组呼叫” < / em>在长时间运行的函数之后发生。从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开始时间:21:45:22.348000 lrf结束时间: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

0 个答案:

没有答案