如何在Django中异步实现回调?

时间:2019-11-15 12:01:14

标签: django python-3.x python-asyncio

我正在使用Django构建一个Web应用,该应用包含两个部分:

  1. 部署docker容器并将到期时间存储在数据库中,
  2. 根据到期时间将其杀死,但是,应用程序的用户可以选择延长容器的使用寿命。

如何在不轮询数据库的情况下实现第二部分?

我尝试使用asyncio并在Django中实现了自定义中间件,但它阻止了执行。还有其他方法可以异步完成这项工作。

import asyncio
from threading import Thread


def callback_func(eventloop):
    """
    check DB
    if now:
        kill
    else:
        register a new callback with new updated time 
    """
    # Logic to kill a container goes here

    print ("Inside callback")


class KillerMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response
        self._eventloop = asyncio.new_event_loop()
        asyncio.set_event_loop(self._eventloop)

        self._t = Thread(target=lambda : self._eventloop.run_forever())
        self._t.daemon = True
        self._t.start()


    def __call__(self, request):

        response = self.get_response(request)

        self._eventloop.call_later(86400, callback_func, self._eventloop)
        return response

1 个答案:

答案 0 :(得分:0)

我对python-asyncio的了解并不多,但是听起来Django Channels才是正确的。