gpt4 book ai didi

python - 在扭曲中使用我自己的主循环

转载 作者:太空狗 更新时间:2023-10-29 22:23:59 27 4
gpt4 key购买 nike

我有一个现有的程序,它有自己的主循环,并根据它接收到的输入进行计算——比方说来自用户的输入,以使其简单。我现在想远程而不是本地进行计算,我决定在 Twisted 中实现 RPC。

理想情况下,我只想更改我的一个函数,比如 doComputation(),调用 twisted 来执行 RPC、获取结果并返回。程序的其余部分应该保持不变。但是,我怎样才能做到这一点?当我调用 reactor.run() 时,Twisted 劫持了主循环。我还读到你并没有真正扭曲线程,所有任务都按顺序运行,所以我似乎不能只创建一个 LoopingCall 并以这种方式运行我的主循环。

最佳答案

您有几个不同的选择,具体取决于您现有程序的主循环类型。

如果它是来自 GUI 库的主循环,Twisted may already have support for it .在这种情况下,您可以继续使用它。

您也可以编写自己的 react 堆。没有很多很好的文档,但是 you can look at the way that qtreactor在 Twisted 外部实现一个 react 器插件。

您还可以使用 threadedselectreactor 编写一个最小 react 器。这方面的文档也很少,但是 the wxpython reactor是用它来实现的。就我个人而言,我不推荐这种方法,因为它很难测试并且可能会导致困惑的竞争条件,但它确实具有让您利用几乎 Twisted 的所有默认网络代码的优势,只需一个薄的包裹层。

如果您确实不希望您的doComputation 是异步的,并且您希望您的程序在等待Twisted 回答时阻塞,请执行以下操作:

  • 在主循环启动之前在另一个线程中启动 Twisted,使用诸如 twistedThread = Thread(target=reactor.run); 之类的东西twistedThread.start()
  • 在您自己的主循环线程中实例化一个对象来执行您的 RPC 通信(比方说,RPCDoer),以便您可以引用它。确保使用 reactor.callFromThread 实际启动其 Twisted 逻辑因此您不需要包装它的所有 Twisted API 调用。
  • 执行 RPCDoer.doRPC 返回 Deferred ,仅使用 Twisted API 调用(即不调用您现有的应用程序代码,因此您无需担心应用程序对象的线程安全;传递 doRPC 它需要的所有信息作为参数)。
  • 您现在可以像这样实现 doComputation:

    def doComputation(self):
    rpcResult = blockingCallFromThread(reactor, self.myRPCDoer.doRPC)
    return self.computeSomethingFrom(rpcResult)
  • 记得调用reactor.callFromThread(reactor.stop); twistedThread.join() 来自主循环的关闭过程,否则您可能会在退出时看到一些令人困惑的回溯或日志消息。

最后,您应该真正考虑的一个选项,尤其是从长远来看:转储现有的主循环,并想出一种只使用 Twisted 的方法。根据我的经验,对于 10 个这样的问题中的 9 个,这是正确的答案。我并不是说这总是要走的路 - 在很多情况下,您确实需要保留自己的主循环,或者只是需要付出太多努力才能摆脱现有循环。但是,维护自己的循环也是可行的。请记住,Twisted 循环已经过数百万用户的广泛测试,并用于各种环境。如果您的循环也非常成熟,那可能没什么大不了的,但如果您正在编写一个小的新程序,那么可靠性的差异可能会很大。

关于python - 在扭曲中使用我自己的主循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303600/

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