gpt4 book ai didi

python - Twisted PerspectiveBroker callRemote from wsgi webapp

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:21 28 4
gpt4 key购买 nike

我正在编写一个wsgi 应用程序,它需要使用Twisted PerspectiveBroker 来调用一些远程方法。问题是 wsgi 需要返回呈现的网页,但对 Twisted 服务的调用是异步的。所以基本上我的网络应用程序需要调用远程方法,然后做一些其他的事情,然后它必须等待远程调用完成,然后呈现页面并将其返回给客户端。

执行此操作的最佳方法是什么?

我目前正计划使用 Flask 来编写应用程序。

最佳答案

一个 WSGI 应用程序在它自己的线程(或进程)中运行。当在 Twisted 的 WSGI 容器中运行时,这是一个不同于运行 react 堆的线程。大多数 Twisted 的 API 都不是线程安全的:它们只能在 react 堆线程中调用。

因此,从 WSGI 应用程序调用 Twisted API 的基本方法是使用 reactor.callFromThread ,它是线程安全的,它会导致在 react 堆线程中调用一个函数:

...
reactor.callFromThread(pbRemote.callRemote, "someMethod", some, args)

但是,这会丢弃您可能想要的结果。在 reactor.callFromThread 之上构建 API 很简单不过,它保留了结果,并且在 Twisted 中也有一个实现:

from twisted.internet.threads import blockingCallFromThread

...
result = blockingCallFromThread(reactor, pbRemote.callRemote, "someMethod", some, args)

此调用将阻塞直到 callRemote 返回 Deferred触发,然后它将返回该 Deferred 的结果。

如果你想打电话,做一些其他的工作,然后等待电话结束,你必须有点创意。您需要调用电话并获得实际的 Deferred它返回,但不阻止它:

resultHolder = blockingCallFromThread(
reactor, lambda: [pbRemote.callRemote("someMethod", some, args)])

然后你就可以做你需要做的其他工作了。当您准备好等待 PB 调用的结果时:

result = blockingCallFromThread(reactor, lambda: resultHolder[0])

这比在单线程场景中使用 Twisted 更笨拙,因此使用 Twisted Web 的原生 API 比构建 WSGI 应用程序确实更容易。请记住,WSGI 的主要目标之一是允许开发可跨不同服务器(Twisted、Apache 等)移植的应用程序。如果您实际上在 WSGI 应用程序中使用 Twisted API,那么它根本不可移植。

关于python - Twisted PerspectiveBroker callRemote from wsgi webapp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8960186/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com