代码之家  ›  专栏  ›  技术社区  ›  Alok

不使用任务队列在Django视图中调用耗时方法

  •  0
  • Alok  · 技术社区  · 6 年前

    每当在 django 查看我运行它作为后台任务使用 celery 并返回响应。

    from my_app.task import long_task
    import json
    
    def my_view(request):
        body = request.body
        body = json.loads(body)
        key = body['key']
        long_task.delay(key) # This will run in background
        return JsonResponse({'message': 'request submitted'})
    

    是否有任何方法可以实现这种行为,在没有任何后台任务队列(如芹菜等)的情况下调用long_task方法,以便快速向用户发送响应?

    我想有办法使用操作系统和Python特性来实现这一点。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Moldovan Daniel    6 年前

    如果您使用的是python>=3.5,则可以尝试Asyncio以运行后台任务:

    from my_app.task import long_task
    import json
    import asyncio
    loop = asyncio.get_event_loop()
    
    
    def my_view(request):
        body = request.body
        body = json.loads(body)
        key = body['key']
        arguments = [key]
        loop.run_in_executor(None, long_task, arguments)
        return JsonResponse({'message': 'request submitted'})
    

    可以找到更多信息 here

    如果您想在较低版本的python上使用asyncio(例如2.7),您应该能够做到这一点,但请记住,标准核心库中没有包含Asyncio,您需要安装它。

        2
  •  0
  •   Andrew_Lvov    6 年前

    好吧,您可以直接在视图处理程序中调用函数。

    如果这是 Celery 任务,你可以打电话 apply :

    long_task.apply(args=[key])