Python Django通道websocket通信是否真正异步?

Python Django通道websocket通信是否真正异步?,python,django,websocket,python-asyncio,django-channels,Python,Django,Websocket,Python Asyncio,Django Channels,我编写了django通道代码,通过WebSocket异步发送来自两个不同来源的api数据。不同的数据源需要几秒钟到一分钟的时间来计算并发回数据。我设法使用asyncio事件循环异步调用它们。但问题是他们没有异步发送响应。代码只是等待所有数据到达,同时发送所有数据 频道代码: class SearchHotelConsumer(AsyncWebsocketConsumer): def __init__(self, *args, **kwargs): super().__in

我编写了django通道代码,通过WebSocket异步发送来自两个不同来源的api数据。不同的数据源需要几秒钟到一分钟的时间来计算并发回数据。我设法使用asyncio事件循环异步调用它们。但问题是他们没有异步发送响应。代码只是等待所有数据到达,同时发送所有数据

频道代码:

class SearchHotelConsumer(AsyncWebsocketConsumer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.source1 = Source1()
        self.source2 = Source2()

    async def connect(self):
        await self.accept()

    def disconnect(self, close_code):
        pass

    async def _source1_handler(self, request, queue):
        source1_response = await self.source1.async_post(request)

        await queue.put(source1_response.data)

    async def _source2_handler(self, request, queue):
        source2_response = await self.source2.async_post(request)

        await queue.put(source2_response.data)

    async def _send_msg(self, queue):
        while True:
            message = await queue.get()
            if message is None:
                break
            print('got the message')
            await self.send(text_data=json.dumps({
                'message': message
            }, cls=DjangoJSONEncoder))

            queue.task_done()

    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        request = HttpRequest()
        request.method = 'POST'
        request.session = self.scope["session"]
        request = Request(request)
        for key, val in message.items():
            request.data[key] = val

        queue = asyncio.Queue()
        sender = asyncio.ensure_future(self._send_msg(queue))

        await self._source1_handler(request, queue)
        await self._source2_handler(request, queue)

        await queue.join()

        sender.cancel()

如何使消息发送部分真正异步?

未显示的异步post代码可能是同步的

如果需要异步请求,请参阅以下答案:

要将请求(或任何其他阻塞库)与asyncio一起使用,可以使用BaseEventLoop.run_in_executor在另一个线程中运行函数,并从中产生结果

或者是http get async的替代方法

async with aiohttp.ClientSession() as session:
        async with session.get(url, headers=HEADERS, params=params) as resp:
            data = await resp.json()

为什么要使用异步队列?为什么不在
\u source2\u handler
\u source1\u handler
中发送消息<代码>等待自我。_source1_handler(…)你可以给他们打电话,让他们都有未来,然后在你给他们都打电话后等待未来。@MatthausWoolard我一开始就是这么做的。它也给出了同样的同步响应…你说的同步是什么意思?因此
s1=self.\u source1\u handler(…)
s2=self.\u source2\u handler(…)
调用这两个
后,等待s1
等待s2如果这不起作用,那么您可能需要创建一个二级嵌套异步运行循环:请参阅,但我认为不需要这样做。