- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个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/
我正在编写一个wsgi 应用程序,它需要使用Twisted PerspectiveBroker 来调用一些远程方法。问题是 wsgi 需要返回呈现的网页,但对 Twisted 服务的调用是异步的。所以
我是一名优秀的程序员,十分优秀!