4

我正在构建一个程序,它有一个在本地使用的类,但我希望在网络上以相同的方式使用同一个类。这意味着我需要能够对其任何公共方法进行同步调用。该类读写文件,所以我认为 XML-RPC 开销太大。我使用来自 twisted 的示例创建了一个基本的 rpc 客户端/服务器,但是我遇到了客户端问题。

c = ClientCreator(reactor, Greeter)
c.connectTCP(self.host, self.port).addCallback(request)
reactor.run()

这适用于单个调用,当接收到数据时,我调用 reactor.stop(),但如果我再进行调用,反应堆将不会重新启动。我应该为此使用其他东西吗?也许是不同的扭曲模块或另一个框架?

(我不包括协议如何工作的细节,因为主要的一点是我只得到一个调用。)

附录和说明:

我分享了一个谷歌文档,里面有关于我在做什么的注释。http://docs.google.com/Doc?id=ddv9rsfd_37ftshgpgz

我有一个使用保险丝编写的版本,可以将多个本地文件夹组合到保险丝安装点。文件访问已经在一个类中处理,所以我希望有服务器可以让我对同一个类进行网络访问。继续搜索后,我怀疑 pyro ( http://pyro.sourceforge.net/ ) 可能是我真正想要的(仅基于现在阅读他们的主页),但我愿意接受任何建议。

我可以通过使用 nfs 挂载并将其与我的本地文件夹组合来获得类似的结果,但我希望所有对等方都可以访问相同的组合文件系统,因此这将要求每台计算机都成为具有多个 nfs 的 nfs 服务器挂载数量等于网络中的计算机数量。

结论: 我决定使用 rpyc,因为它给了我我想要的东西。一个服务器,它保留一个类的实例,我可以像在本地一样操作它。如果有人感兴趣,我会将我的项目放在 Launchpad ( http://launchpad.net/dstorage ) 上。

4

4 回答 4

2

对于同步客户端,Twisted 可能不是正确的选择。相反,您可能想直接使用 socket 模块。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((self.host, self.port))
s.send(output)
data = s.recv(size)
s.close()

recv()可能需要重复调​​用,直到您得到一个空字符串,但这显示了基础知识。

或者,您可以重新安排整个程序以支持异步调用...

于 2008-11-11T20:04:35.330 回答
2

如果您甚至在考虑 Pyro,请先检查RPyC,然后重新考虑 XML-RPC。

关于 Twisted:尝试让反应堆保持启动而不是停止它,并且ClientCreator(...).connectTCP(...)每次都这样做。

如果您self.transport.loseConnection()在您的协议中,您将不会留下打开的连接。

于 2008-11-13T22:53:32.297 回答
2

为什么你觉得它需要同步?

如果您想确保一次只发生其中一个,请通过 DeferredSemaphore 调用所有调用,以便您可以对实际调用进行速率限制(任意值)。

如果您希望能够在不同时间运行这些流的多个流,但不关心并发限制,那么您至少应该将反应器启动和拆除与调用分开(反应器应该在整个过程的生命周期中运行)。

如果您只是不知道如何在反应器模式中表达应用程序的逻辑,您可以使用 deferToThread 并编写一段纯同步代码——尽管我猜这不是必需的。

于 2008-11-24T23:32:46.583 回答
1

如果您使用的是 Twisted,您可能应该知道:

  1. 您不会对任何网络服务进行同步调用
  2. 反应器只能运行一次,所以在reactor.stop()您的应用程序准备好退出之前不要停止它(通过调用)。

我希望这回答了你的问题。我个人认为 Twisted正是您的用例的正确解决方案,但您需要解决同步性问题。

附录和说明:

我不明白的部分原因是,当我调用 reactor.run() 时,它似乎进入了一个只监视网络活动的循环。如何在使用网络时继续运行程序的其余部分?如果我能克服这一点,那么我可能可以解决同步性问题。

这正是 reactor.run() 所做的。它运行一个主循环,它是一个事件反应器。它不仅会等待工作事件,还会等待您计划发生的任何其他事情。使用 Twisted,您将需要以处理其异步特性的方式构建应用程序的其余部分。也许如果我们知道它是什么类型的应用程序,我们可以提供建议。

于 2008-11-11T22:07:13.990 回答