[英]Django Channels websocket communication not truly asynchronous?
我編寫了 django 通道代碼,通過 websockets 異步發送來自兩個不同來源的 api 數據。 不同的來源需要幾秒鍾到 1 分鍾的時間來計算和發回數據。 我設法使用 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()
如何使消息發送部分真正異步?
您未顯示的 async_post 代碼可能是同步的。
如果您想要異步請求,請參閱此答案:
https://stackoverflow.com/a/22414756/10840818
要將請求(或任何其他阻塞庫)與 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.