代码之家  ›  专栏  ›  技术社区  ›  Asa Ayers

如何进行同步rpc调用

  •  4
  • Asa Ayers  · 技术社区  · 16 年前

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

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

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

    附录及附件;澄清:

    http://docs.google.com/Doc?id=ddv9rsfd_37ftshgpgz

    我有一个使用fuse编写的版本,可以将多个本地文件夹合并到fuse装入点。文件访问已经在一个类中处理,所以我希望有一些服务器可以让我通过网络访问同一个类。在继续搜索之后,我怀疑是派罗( http://pyro.sourceforge.net/

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

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

    4 回复  |  直到 16 年前
        1
  •  2
  •   orip    16 年前

    如果你真的在考虑烟火,那就去看看吧 RPyC

    关于扭曲:试着让反应堆停下来,而不是停下来,然后 ClientCreator(...).connectTCP(...) 每一次。

    如果你 self.transport.loseConnection()

        2
  •  2
  •   Dustin    16 年前

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

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

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

        3
  •  1
  •   eswald    16 年前

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

    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()

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

        4
  •  1
  •   Ali Afshar    16 年前

    如果您正在使用Twisted,您可能应该知道:

    1. 反应堆只能运行一次,因此不要停止(通过调用 reactor.stop() )直到您的应用程序准备退出。

    我希望这能回答你的问题。我个人认为这是扭曲的

    附录及附件;澄清:

    我不明白的是 当我调用reactor.run()时 似乎进入了一个循环 监视网络活动。我该怎么办 继续跑完我剩下的时间 我可以克服它,然后我可以 可能是通过

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