Python 执行非阻塞请求?-德扬戈

Python 执行非阻塞请求?-德扬戈,python,django,asynchronous,nonblocking,Python,Django,Asynchronous,Nonblocking,最近我一直在使用其他框架,比如NodeJS 我喜欢回复的可能性,并且仍然能够做进一步的操作 e、 g 也许Django已经提供了一种在返回请求后执行操作的方法,如果是这样的话,那就太好了 非常感谢您的帮助=D不是现成的,因为您已经从方法中返回。您可以使用类似这样的方法将do\u more\u stuff任务传递到队列中,然后让它在http请求/响应流之外运行do\u more\u stuff()。Django允许您通过信号来完成此任务,可以找到更多信息。(请注意,正如我在下面的评论中所说,信

最近我一直在使用其他框架,比如NodeJS

我喜欢回复的可能性,并且仍然能够做进一步的操作

e、 g


也许Django已经提供了一种在返回请求后执行操作的方法,如果是这样的话,那就太好了



非常感谢您的帮助=D

不是现成的,因为您已经从方法中返回。您可以使用类似这样的方法将
do\u more\u stuff
任务传递到队列中,然后让它在http请求/响应流之外运行
do\u more\u stuff()

Django允许您通过信号来完成此任务,可以找到更多信息。(请注意,正如我在下面的评论中所说,信号不是非阻塞的,但它们允许您在视图中返回响应后执行代码。)


如果您正在考虑执行很多很多异步请求,并且需要它们是非阻塞的,那么您可能需要签出。

因为您是从函数返回的,do\u more\u stuff将永远不会被调用

如果你想在回家前做一些繁重的事情,按照罗斯的建议,排队做一些事情(+1表示芹菜)

但是,如果您希望返回一些内容。。。然后做一些事情并将更多的内容返回给用户流媒体可能就是你想要的。您可以将迭代器或生成器传递给HttpResponse,它将以涓涓流的方式迭代并推出内容。这感觉有点恶心,但如果你是一个发电机摇滚明星,你可能能够在不同的州做足够的事情来完成你想要的

或者,我想您可以简单地重新设计页面,使用大量ajax来完成所需的工作,包括向django视图触发事件、从视图读取数据等

这可以归结为异步的负担在哪里:客户机、服务器还是响应

我对node.js还不太熟悉,但是看看您所讨论的用例会很有趣


编辑:我对信号做了更多的研究,虽然它们确实发生在过程中,但在django处理请求后,有一个内置的请求信号\u完成,尽管它更像是一个包罗万象的解决方案,而不是特定的解决方案。

您可以将线程作为临时修复或非生产解决方案,但它既不可扩展,也不是最佳实践。使用芹菜更好的设计

def foo(request):
    import threading
    from time import sleep
    def foo():
        sleep(5)
        # Do something
        print('hello, world')
    threading.Thread(target=foo).start()
    return JsonResponse(data={'detail': 'thread started'})

此外,这种方法在技术上不会是非阻塞的,因为Django在大多数部署中都不是非阻塞框架,但它可以让您在返回响应后做一些事情。Tornado会让你执行非阻塞请求。@Zack:谢谢你,我没想到信号会帮我这么做。-1。这根本不符合OP的要求。信号是在进程中执行的,在运行时会阻塞请求。正如我所说,Django不提供任何类型的非阻塞回调,但是它提供了在请求返回后执行处理的能力。我还提出了一个框架的建议,该框架允许这样做,您还想要什么呢?但使用信号将允许您在请求返回后执行某些操作,这并不是真的。如果你发送一个信号,这个信号就会在同一个过程中执行。因此,在信号完成执行之前,不会返回请求。
def foo(request):
    import threading
    from time import sleep
    def foo():
        sleep(5)
        # Do something
        print('hello, world')
    threading.Thread(target=foo).start()
    return JsonResponse(data={'detail': 'thread started'})