【发布时间】:2019-11-18 21:46:38
【问题描述】:
在我们的 django-channels 异步消费者中,我正在尝试检索组结果。这个结果可能是也可能不是完整的,因此我想在管道结果准备好时添加一个回调。问题是,websocket 是异步的,回调必须是同步的,self.send 方法必须是异步的。最初我假设能够将异步发送包装在async_to_sync 中,尽管它给出了错误You cannot use AsyncToSync in the same thread as an async event loop - just await the async function directly.,因此似乎不允许异步->同步->异步。
class ImageConsumer(AsyncWebsocketConsumer):
async def celery_retrieve_group_result(self, batch_id):
group = group = celery.GroupResult().restore(batch_id)
res = group.get(callback=self.sync_callback)
def sync_callback(self, task_id, value):
async_to_sync(self.send_group_result)(task_id, value)
async def send_group_result(self, task_id , value):
await self.send(json.dumps({"type": "result.redraw_border", "result": value}))
我尝试了不同的组合,但我的限制因素是回调必须是同步的,而其他一切都是异步的。 有没有人以这种方式将芹菜与异步 django 混合的经验? 任何帮助将不胜感激!
【问题讨论】:
标签: asynchronous websocket celery django-channels python-asyncio