【问题标题】:Twisted making a function non-blocking扭曲使函数非阻塞
【发布时间】:2017-01-05 09:19:40
【问题描述】:

我正在使用twisted 来制作async 网络服务器(学习甚至基于异步编程的想法)。考虑这种情况,服务器在某个端点收到GET 请求时,例如http:localhost:8000/api/v1/calc_fact?num=1000 计算1000 的阶乘并返回结果。这部分很容易获得。我也知道延迟 API。我如何定义我的函数calc_factorial() 以便它返回一个延迟并且整体结果是非阻塞的。

我该如何解决这个问题?

【问题讨论】:

  • @KlausD。这是唯一的方法吗?说 insted 使用这个函数我的函数在这种情况下调用 db 这也是正确的方法吗?
  • 不,有几种方法。对于 DB 调用,twisted 具有异步的数据库模块。
  • @KlausD。谢谢回复。我希望我明白了
  • @KlausD。线程也是不可扩展的。这就是使用 twisted 的全部意义所在。据我了解,defetToThread 只是将方法交给线程并以线程安全的方式处理回调和错误返回。但是再次使用twisted有什么用呢?

标签: python asynchronous twisted


【解决方案1】:

我也做过类似的事情。

在您的资源中,您需要返回一个 server.NOT_DONE_YET 并像这样添加 calc_factorial 延迟回调

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_factorial 中写入请求:

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

一旦你写完请求,它就会触发 NOT_DONE_YET

【讨论】:

  • 我认为这是一个 hack 对吧?因为我们正在创建一个Deferred 对象,然后将一个回调附加到它上面,原来的函数是为了返回deferred。这显然会起作用,但正确的方法应该是使用 deferToThread 。回调是应该在原始TIME_CONSUMING_FUNCTION 被处理后运行的东西。
  • mm 不知道你所说的 hack 是什么意思,你可以在文档中看到同样的结构 _delayedRender 和 NOT_DONE_YET twistedmatrix.com/documents/12.0.0/web/howto/web-in-60/…
猜你喜欢
  • 2023-04-08
  • 2012-03-07
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多