Python 使函数无阻塞

Python 使函数无阻塞,python,asynchronous,twisted,Python,Asynchronous,Twisted,我正在使用twisted制作一个异步Web服务器,以了解基于偶数的异步编程背后的思想。考虑这个场景,服务器在某个端点上获得GET请求时,EXHTTP:LoalHoal:8000 /API/V1/CalcStruth.Num=1000计算1000的阶乘,并返回结果。这部分很容易得到。我也知道延迟API。我如何定义我的函数calc_factorial,以便它返回一个延迟的结果,并且整体结果是非阻塞的 我如何解决这个问题 我也做过类似的事情 在您的资源中,您需要返回一个server.NOT_DONE_

我正在使用twisted制作一个异步Web服务器,以了解基于偶数的异步编程背后的思想。考虑这个场景,服务器在某个端点上获得GET请求时,EXHTTP:LoalHoal:8000 /API/V1/CalcStruth.Num=1000计算1000的阶乘,并返回结果。这部分很容易得到。我也知道延迟API。我如何定义我的函数calc_factorial,以便它返回一个延迟的结果,并且整体结果是非阻塞的


我如何解决这个问题

我也做过类似的事情

在您的资源中,您需要返回一个server.NOT_DONE_,然后添加calc_factorial deferred回调,如下所示

def render_GET(self, request):
    d = Deferred()
    reactor.callLater(1, d.callback, None)
    d.addCallback(self.calc_factorial, request)
    d.addErrback(rror_handler, request)
    return server.NOT_DONE_YET
然后在calc_阶乘中写入请求:

def calc_factorial(self, request):
    # something something
    request.write("factorial calc done")
    request.finish()

一旦您写入请求finish,它将触发NOT_DONE_尚未

使用deferToThread,如@KlausD所示。这是唯一的办法吗?如果不使用这个函数,我的函数会调用db,在这种情况下,这也是正确的方法吗?不,有几种方法。对于DB调用,twisted具有异步的数据库模块。@klauds。谢谢你的回复。我希望我能it@KlausD. 此外,线程是不可伸缩的。这就是使用twisted的全部目的。据我所知,defetToThread只是将方法交给一个线程,并以线程安全的方式处理回调和错误回调。但是再说一遍,使用twisted有什么用呢?我认为这是一个黑客攻击,对吗?因为我们正在创建一个延迟对象,然后将一个回调附加到该对象上,该回调带有原始函数,该函数用于返回延迟对象。这显然是可行的,但正确的方法应该是使用deferToThread。回调应该是在处理原始耗时函数之后运行的。mm不知道你说的hack是什么意思,你可以在文档中看到同样的结构,带有_delayedRender和NOT_DONE