如何在django视图内将任务添加到asyncio循环中?

时间:2019-12-02 20:12:22

标签: python django django-channels python-asyncio

我有一个将get_response方法设置为协程的中间件,以便可以一起运行另一个任务:

class AsyncMiddleware:
    def __init__(self, get_response):
        self.get_response = asyncio.coroutine(get_response)

    def __call__(self, request):
        tasks = [self.get_response(request), <OTHER_ASYNC>]
        response, *other_response = asyncio.run(self.gather(tasks))
        return response

    async def gather(self, tasks):
        return await asyncio.gather(*tasks)

在我的django视图中,我需要使用django通道根据PATCH请求将任务发送给工作人员。当我尝试将任务添加到循环中时,响应完成,我的模型已更新,但任务从未发送给我的工作人员。

                loop = asyncio.get_event_loop()
                channel_layer = get_channel_layer()
                result = loop.create_task(channel_layer.send(
                    'model-update',
                    {
                        'type': 'update',
                        'data': {}
                    },
                ))

我尝试了此代码的许多不同变体。如果我从中间件中删除了异步代码并在asigref中使用了async_to_sync,那么一切都会按预期进行(这不是一个真正的选择,因为async_to_sync不能在运行循环中使用)

0 个答案:

没有答案